【发布时间】:2011-05-04 20:04:01
【问题描述】:
这更多的是为什么它会起作用,这不是问题......
我在多个线程上使用 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],但我似乎无法弄清楚为什么它会使线程暂停。我能够在调试器中按 continue 并继续前进……但我不明白为什么它会以这种方式运行。
我认为我做错了什么,我担心我的新方法可能只是一个 hack。
感谢您的帮助!
【问题讨论】:
标签: objective-c multithreading ios core-data nsmanagedobjectcontext