带有 NSOperation 的 MagicalRecord 导致持久性问题

MagicalRecord with NSOperation causing persistence issues

我正在使用 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 并 运行ning 它们然后会导致一些混合数据。

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

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

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

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

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