Tag: multithreading

SceneKit – 线程 – 在哪个线程上做什么?

使用SceneKit时,更新方法: func renderer(aRenderer: SCNSceneRenderer, updateAtTime time: NSTimeInterval) 是不是在主要的调用,但在其他线程。 我应该在主线程上做什么,在这个“SceneKit线程”上做什么? 我应该在哪里添加新的节点/几何? 修改这些对象的位置等是安全的吗?

CoreDataasynchronous获取导致并发debugging器错误

我正在使用 -com.apple.CoreData.ConcurrencyDebug 启动时debugging我的CoreData应用程序中的并发性。 在应用程序启动期间,我对主线程的托pipe对象上下文执行asynchronous获取。 // set up the async request NSError * error = nil; [MOC executeRequest:asyncFetch error:&error]; if (error) { NSLog(@"Unable to execute fetch request."); NSLog(@"%@, %@", error, error.localizedDescription); } 这个代码是从主线程调用的,但是executeRequest:将它排入另一个线程,我知道这是正确的行为。 并发debugging器不喜欢这个,说(我认为)我在这里做错了什么。 我也试过在[MOC performBlock:]包装这也是[MOC performBlock:] ,但也会导致multithreading违规。 在这两种情况下,我得到这个: [NSManagedObjectContext __Multithreading_Violation_AllThatIsLeftToUsIsHonor__ 我是使用asynchronous提取不正确,还是在这里的并发debugging器错误? 编辑:我也试图包装它在MOC performBlock应该确保它从主线程调用。 在任何情况下,调用都从主线程中排队 ,但在其他地方执行。 编辑:这里是获取请求: NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"MyEntity"]; NSPredicate * pred […]

核心数据的UISearchBar性能问题

当我使用UISearchBar并将某些内容写入searchstring时, 整个search事件会变得有点迟缓 。 我的猜测是我在主线程中搞乱了UI的东西和核心数据,但是我可能是错的。 更重要的是,我为所有这些东西使用一个实体,所以没有关系等等。这个表中有3321个对象,这个应用程序大约需要12到14 MB的RAM ,你可以在下面的截图中看到: 我认为这样会更有效率,因为3321个对象不是那么多。 对于所有核心数据的东西我使用MagicalReacord 。 我操作NSPredicate一个实例,但在主表视图和search表视图之间切换NSPredicate 。 但是,没有什么比这更有价值的源代码,所以在这里你去: #import "GroupsViewController.h" #import "CashURLs.h" #import "Group.h" #import <AFNetworking.h> @interface GroupsViewController () { NSPredicate *resultPredicate; UIRefreshControl *refreshControl; } @property (strong, nonatomic) NSMutableArray *selectedGroups; @property (strong, nonatomic) NSFetchedResultsController *groupsFRC; @end @implementation GroupsViewController -(void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; // Getting array of selected groups self.selectedGroups = […]

URLSessionTask如何运行

说我已经创build了一个URLSessionTask的实例: let task = URLSession.shared.dataTask(with: url) { (data, response, error) in print (\(Thread.current)) } // I start the task by task.resume() 我想了解URLSessionTask实例是默认在主线程还是在后台线程中运行。 所以,我打印Thread.current 。 当我运行我的代码时,它打印出来: <NSThread: 0x170273980>{number = 4, name = (null)} 我的问题是: 哪个线程的URLSessionTask默认运行? 主线程或后台线程? 为什么当前线程在线程name显示为空? 这是否意味着它默认在后台线程中运行? (我看到名称=“主”在主线上print ) 一般来说,是否有必要使用GCD运行URLSessionTask以强制它在后台线程中运行? 我问这是因为我看到一些教程不使用GCD来运行URLSessionTask ,他们只使用GCD在主线程中运行完成处理程序。

我如何运行一个没有阻止我的iPhone应用程序中的用户界面的进程

我正在访问iPhone上的照片库,它需要很长时间导入我select在我的应用程序中的图片,我如何在辅助线程上运行该过程,或者我用什么解决scheme不阻止用户界面?

使用dispatch_sync作为互斥锁

这是我需要做的。 我希望dispatch_sync是使用GCD的最好方法 我有一些关键部分的代码放在Appdelegate的applicationDidBecomeActivecallback中。 我在dispatch_sync调用中封装了这个方法,所以无论调用了多less次的applicationDidBecomeActive,它只被调用一次 – (void)applicationDidBecomeActive:(UIApplication *)application{ dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ NSLog(@"Thread created"); //crtical code [self runCriticalSection]; });} 这是使用dispatch_sync做正确的方法吗?

使用dispatch_async在Swift中同时分析一个数组

我正尝试使用GCD的后台线程同时分析照片。 这是我写的代码: dispatch_async(dispatch_get_global_queue(Int(QOS_CLASS_UTILITY.value), 0)) { for (var i = 0; i < 8; i++) { let color = self.photoAnalyzer.analyzeColors(imageStrips[i]) colorList.append(color) } } 为了澄清variables名称,下面是它们的描述: photoAnalyzer是我写的一个名为Analyzer的类的一个实例,它包含处理图像的所有方法。 analyzeColors是Analyzer类中的一个方法,它执行大部分分析,并返回一个string,其中传入的图像的主色 imageStrips是构成原始图像部分的UIImage数组 colorList是一个string数组,用于存储图像每个部分的analyzeColor方法的返回值。 上面的代码依次运行,因为for循环一次只能从imageList访问一个图像。 我试图做的是同时分析imageStrips每个图像,但我不知道该怎么做。 任何build议将不胜感激。 如果你想看到所有的代码来进一步帮助我,我可以发布一个GitHub链接到它。 编辑这是我更新的代码来同时处理8个处理器。 dispatch_apply(8, imageQueue) { numStrips -> Void in let color = self.photoAnalyzer.analyzeColors(imageStrips[numStrips]) colorList.append(color) } 但是,如果我尝试使用超过8个代码,实际上运行速度比顺序执行要慢。

将消息从后台线程发送到iOS上的主线程

我有一个iOS应用程序,我正在后台线程完成任务。 随着每个任务完成,我想发送消息到主线程,以便我可以沿着我的自定义进度栏移动到适当的阶段。 什么是最简单但最安全的方法来实现这一点? 编辑1 这是我正在使用的方法: dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, (unsigned long)NULL), ^(void) { // get background tasks done. [self.background backgroundMethod]; }); 编辑2 这里是我试图用@ Madboy的答案的一个例子。 在我在后台执行方法的类中,我有一个指向我的进度条的指针。 我们认为这会起作用吗? (请注意更改也编辑1)。 @implementation BackgroundClass @synthesize delegate; @synthesize customProgressBar – (void)backgroundMethod { // Run tasks } – (void)delegateSaysBackgroundMethodIsFinished { [self performSelectorOnMainThread:@selector(tasksDone:) withObject:self.customProgressBar waitUntilDone:NO]; } @implementation CustomProgressBar – (void)tasksDone { // change UI to reflect […]

崩溃NSManagedObject版本:“objc_msgSend()select器名称:_queueForDealloc”

我有很多用户通过HockeyApp得到了一个奇怪的崩溃,下面的堆栈跟踪。 这似乎与NSManagedObject被释放在不同的调度队列中有关…但我没有得到任何象征性的问题可能。 这似乎是一个内存pipe理问题,但我使用ARC,所以不知道如何过度释放一个NSManagedObject。 这是我得到的崩溃报告(主线程在不同时间显示不同的痕迹): Code Type: ARM-64 Parent Process: launchd [1] Date/Time: 2014-05-12T05:43:54Z OS Version: iPhone OS 7.0.6 (11B651) Report Version: 104 Exception Type: SIGSEGV Exception Codes: SEGV_ACCERR at 0x1c3dbeb8 Crashed Thread: 2 Application Specific Information: objc_msgSend() selector name: _queueForDealloc: Thread 0: 0 CoreFoundation 0x000000018e384618 CFNumberGetType + 0 1 CoreFoundation 0x000000018e3333b8 _CFAppendXML0 + 2768 2 […]

在后台线程中保存到CoreData上下文中

一段时间以来,我一直在为此苦苦挣扎,而苹果公司的文档和SO目前还没有帮助。 我在UIManagedDocument上使用ManagedObjectContext,下面的代码工作正常。 然后,我决定在AppDelegate中使用Apple的AppleData模板,因此在AppDelegate中创build了模型,持久性存储协调器和上下文。 获取AppDelegate的上下文没有问题,但是后台保存是一个问题。 我应该在我保存的线程上使用本地上下文,并根据苹果公司的具体情况设置相同的持久性存储协调器。 但下面的代码实际上并没有保存数据。 有人可以请指教吗? 谢谢。 – (void)fetchAndPersist { dispatch_queue_t ffetchQ = dispatch_queue_create("ForFetch", NULL); dispatch_async(ffetchQ, ^{ NSManagedObjectContext *secureManagedObjectContext; NSPersistentStoreCoordinator *coordinator = [appDelegate persistentStoreCoordinator]; if (coordinator != nil) { secureManagedObjectContext = [[NSManagedObjectContext alloc] init]; [secureManagedObjectContext setPersistentStoreCoordinator:coordinator]; } // find missing date DataManager *dataManager = [[DataManager alloc] init]; NSDate *missingDate = [dataManager findMissingDateFromDate:selectedDate inContext:secureManagedObjectContext]; if […]