ThreadedCoreData 示例(来自 Apple)是不是在主线程上创建 NSManagedObjectContext?

Posted

技术标签:

【中文标题】ThreadedCoreData 示例(来自 Apple)是不是在主线程上创建 NSManagedObjectContext?【英文标题】:Is ThreadedCoreData example (from Apple) creating NSManagedObjectContext on main thread?ThreadedCoreData 示例(来自 Apple)是否在主线程上创建 NSManagedObjectContext? 【发布时间】:2012-06-17 21:31:44 【问题描述】:

来自http://goo.gl/MkV8V

您必须在将要使用它的线程上创建托管上下文。如果您使用 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 的示例代码不太可能不正确。

【问题讨论】:

【参考方案1】:

这里说的好。似乎代码不正确(但也许我错了)。根据我的经验,您应该在 start 方法中创建上下文(例如),否则可能会发生一些奇怪的事情。

另一条规则是你不能在踏板之间传递NSManagedObject。改为传递NSManagedObjectID。在传递它们之前,您需要保存到磁盘。

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

【讨论】:

【参考方案2】:

在我看来你是对的。 Apple 似乎在此示例代码中打破了自己的规则。然而,在实践中,这似乎并没有太多宣传,只要托管对象上下文仅在一个线程上使用,您就是安全的,无论上下文是在哪个线程上创建的。

【讨论】:

以上是关于ThreadedCoreData 示例(来自 Apple)是不是在主线程上创建 NSManagedObjectContext?的主要内容,如果未能解决你的问题,请参考以下文章

来自 SSPI 的 KRB_AP_REQ 票证

Micropython esp32/8266AP模式下网页点灯控制示例

Arduino ESP8266 AP网络模式下运用示例

python AP算法示例

Micropython esp32/8266AP模式下网页点灯控制示例+自定义GPIO状态显示

ASN.1编解码:asn1c-ORAN-E2AP编解码示例