【问题标题】:iOS/Objective-C: Save to core data in background threadiOS/Objective-C:在后台线程中保存到核心数据
【发布时间】:2016-12-29 03:16:11
【问题描述】:

我正在尝试遵循此 Apple 示例代码,以在包含此代码的后台保存到核心数据的最佳实践:

NSArray *jsonArray = …; //JSON data to be imported into Core Data
NSManagedObjectContext *moc = …; //Our primary context on the main queue

NSManagedObjectContext *private = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[private setParentContext:moc];

我的主要 MOC 保存在一个属性中。但是,无论我是分配一个新的 MOC 还是使用属性中的 MOC,我都会收到错误消息:

'Parent NSManagedObjectContext must use either NSPrivateQueueConcurrencyType or NSMainQueueConcurrencyType.'
*** First throw call stack:

据说解决这个问题的方法是为 MOC 指定并发类型,如下所示:

managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];

这应该在主核心数据堆栈中完成吗?还是您创建一个新的 MOC?我尝试创建一个新的 MOC 并收到 MOC 为空的错误。创建第二个 MOC 似乎也是多余的,而私有的 MOC 是三个。另一方面,我害怕更改主要核心数据堆栈,因为它可能会在应用程序中抛出其他东西。

解决此问题的最佳方法是什么?

【问题讨论】:

    标签: ios core-data concurrency


    【解决方案1】:

    主 MOC 应该是后台私有 moc 的子代,而不是相反。每当您保存主 moc 时,私有 moc 都会更新(因此您需要设置 mergePolicy),然后保存到磁盘。在这种情况下,您不需要超过 2 个 mocs。

    因为保存会在后台线程中,所以你的代码会在主线程中运行更流畅。

    NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; // primary context on the main queue
    moc.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
    
    NSManagedObjectContext *privateMoc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
    privateMoc.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
    [moc setParentContext:privateMoc];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-12
      • 1970-01-01
      相关资源
      最近更新 更多