2

http://goo.gl/MkV8V是ThreadedCoreData示例(来自Apple)在主线程上创建NSManagedObjectContext?

您必须在将要使用的线程上创建托管上下文。如果您使用NSOperation,请注意其init方法在与调用方相同的线程上调用。因此,您不得为队列的init方法中的队列创建托管对象上下文,否则它将与调用方的线程关联。相反,你应该在main(对于一个串行队列)或start(对于一个并发队列)中创建上下文。

http://goo.gl/6CMO4

在ConnectionDidLoading方法:

ParseOperation *parseOperation = [[ParseOperation alloc] initWithData:self.earthquakeData]; 
[self.parseQueue addOperation:parseOperation]; 
[parseOperation release]; // once added to the NSOperationQueue it's retained, we don't need it anymore 

ConnectionDidiLoading被称为主线程上。现在里面的ParseOperation :: initWIthData方法,我们有这样的事情:(见ParseOperation.m文件)

// setup our Core Data scratch pad and persistent store 
    managedObjectContext = [[NSManagedObjectContext alloc] init]; 
    [self.managedObjectContext setUndoManager:nil]; 

    SeismicXMLAppDelegate *appDelegate = (SeismicXMLAppDelegate *)[[UIApplication sharedApplication] delegate]; 
    [self.managedObjectContext setPersistentStoreCoordinator:appDelegate.persistentStoreCoordinator]; 

我的理解是,这managedObjectContext仍然是主要的线程上创建。

如果有人澄清或纠正我的理解,将不胜感激,因为Apple的示例代码不太正确。

回答

0

好点。似乎代码是不正确的(但也许我错了)。基于我的经验,你应该在启动方法内创建上下文(例如)或者可能发生奇怪的事情。

另一个规则是你不能通过NSManagedObject之间的踩点。改为通过NSManagedObjectID。在传递它们之前,您需要保存到磁盘。

这些规则已在iOS 5中实施。从iOS 5开始,您可以利用Core Data新API在专用队列(还有一个主队列)中创建上下文,并在那里执行长时间运行计算。另外如果你通过NSManagedObject之间发生线程异常。

0

在我看来你是正确的。 Apple似乎在这个示例代码中违反了他们自己的规则。然而,在实践中似乎并没有多少广告,只要被管理的对象上下文仅用于一个单独的线程,就可以保证安全,而不管在哪个线程上创建上下文。

相关问题