【问题标题】:MagicalRecord with NSOperation causing persistence issues带有 NSOperation 的 MagicalRecord 导致持久性问题
【发布时间】:2015-08-19 14:58:29
【问题描述】:

我正在使用 MagicalRecord 来管理我的核心数据。我的应用程序经常接收需要迭代的数据块,然后作为记录单独添加到存储中并保存。我将此代码放入 NSOperation 中。它看起来像这样:

class AddIncomingMessageOperation: NSOperation {
    override func main() {
        let context = NSManagedObjectContext.MR_context()

        self.message = Message.createMessage(
            json: self.messageJSON,
            context: context)
        if self.message != nil {
            context.MR_saveToPersistentStoreAndWait()
        }
    }
}

NSOperationQueue.mainQueue 上运行它似乎没有问题,除了阻止 UI。但我的下一步是在他们自己的后台操作队列上运行所有这些操作。将它们添加到这个 NSOperationQueue 并运行它们会导致一些混合数据。

我的意思是——我的 createMessage 函数检查现有的 Conversation 对象,如果存在则将其添加到对话中,如果不存在则创建一个。所以它需要知道商店中已经存在的东西。当他们在后台队列上运行时,似乎正在发生的事情是他们正在创建刚刚在另一个操作中创建的对话。

我可以通过设置operationQueue.maxConcurrentOperationCount = 1 来解决所有这些问题,但这显然会减慢整个过程的速度。

【问题讨论】:

    标签: ios core-data nsoperation nsoperationqueue magicalrecord


    【解决方案1】:

    您不能在后台线程上使用主线程上下文。不在 Core Data 中,也不在 Magical Record 中。

    使用专为后台操作设计的 MR 方法,例如 saveWithBlock。使用MR_newContext 创建背景上下文。

    如果您使用这些简单的 API,您也许可以省去繁琐的 NSOperation 子类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-16
      • 1970-01-01
      • 2011-08-11
      • 1970-01-01
      • 2017-01-12
      • 2017-04-25
      • 1970-01-01
      相关资源
      最近更新 更多