0

合并到多个线程这更多的是为什么这个工作,也不至于那种问题......的NSManagedObjectContext保存/通过notifcation中心问题

我使用CoreData在多个线程。我正在催生关闭主线程的两个线程,他们都进行了类似的电话:

id observerObject = [notificationCenter addObserverForName:NSManagedObjectContextDidSaveNotification 
                 object:secondManagedObjectContext 
                 queue:nil 
                usingBlock:^(NSNotification *saveNotification) { 
                 dispatch_async(dispatch_get_main_queue(), ^{ 
                  [mainThreadManagedObjectContext mergeChangesFromContextDidSaveNotification:saveNotification]; 
                 }); 
                }]; 
    [secondManagedObjectContext save:nil]; 


    [notificationCenter removeObserver:observerObject 
            name:NSManagedObjectContextDidSaveNotification 
           object:syncManagedObjectContext]; 

这似乎很好地工作,但以前我与通知中心这样做的,有一些问题:

id observerObject = [notificationCenter addObserverForName:NSManagedObjectContextDidSaveNotification 
                 object:secondManagedObjectContext 
                 queue:[NSOperationQueue mainQueue] 
                usingBlock:^(NSNotification *saveNotification) { 
                 [mainThreadManagedObjectContext mergeChangesFromContextDidSaveNotification:saveNotification]; 
                }]; 

这有时会起作用,但有时XCode会在启动时暂停并在呼叫中放下一个绿色断点,并列出线程及其编号,但不会出现错误。 (注意:如果我产生两个或更多线程,则只会出现此问题)。

罪魁祸首似乎是:[NSOperationQueue mainQueue],但我似乎无法弄清楚为什么它会使线程暂停。我能够继续在调试器中继续前进......但我不明白为什么它以这种方式运行。

我认为我做错了什么,我担心我的新方法可能只是一个破解。

感谢您的帮助!

回答

1

我觉得第一个作品是因为异步调度。没有这一点,通知中心将暂停,直到任何特定的通知完成。你得到的问题听起来像是一个典型的代码停顿,代码只是暂停而没有错误,直到最终调试器超时。

0

不确定这是否有帮助,但是您的队列为零的位置尝试使用通用队列。看看苹果文档中的接待员设计模式。

NSOperationQueue *queue = [[NSOperationQueue alloc] init]; 
0

您的第一个代码示例中的合并被正确地分派到主线程上,这最可能也是moc创建的线程。

在第二个示例中,如果在bg线程上发出通知(通知回调始终在发布通知的同一线程上调用该通知),将在后台线程上执行合并。

顺便说一句,不是使用主队列,我现在宁愿使用NSManagedObjectContext自己的performBlock:方法(> = iOS 5)。在使用ARC的iOS5上,此代码归结为:

__weak typeof(self) weakSelf = self; 
[[NSNotificationCenter defaultCenter] addObserverForName:NSManagedObjectContextDidSaveNotification object:nil queue:nil usingBlock:^(NSNotification *note) { 
    [weakSelf.moc performBlock:^{ 
     [weakSelf.moc mergeChangesFromContextDidSaveNotification:note]; 
    }]; 
}]; 
相关问题