将NSManagedObject(在主上下文中创建)从后台线程传递到主线程是否安全?

时间:2015-09-15 23:42:46

标签: core-data

我正在使用AFNetworking来解析一些数据然后保存到CoreData,我想做这样的事情。

let parserContext: NSManagedObjectContext = MTCoreDataManager.sharedManager().newPrivateManagedObjectContext()
let mainContext: NSManagedObjectContext = MTCoreDataManager.sharedManager().managedObjectContext()

override func responseObjectForResponse(response: NSURLResponse!, data: NSData!, error: NSErrorPointer) -> AnyObject? {
    var model: NSManagedObject?
    parserContext.performBlockAndWait {
        ....parsing data...
        ....create model and assign value...
        ....save model...
        let objID = model.objectID
        mainContext.performBlockAndWait {
           model = mainContext.objectWithID(objID)
        }
    }
    return model
}

let op = AF.GET(path, parameters: nil, success: { (operation: AFHTTPRequestOperation, response: AnyObject) -> Void in
        // main thread
        println(response)
}) { (operation: AFHTTPRequestOperation, error: NSError) -> Void in
        println(error.description)
}

由于responseObjectForResponse在后台线程中运行,我想使用后台上下文来解析数据并在该上下文中创建NSManagedObject,然后在主线程中返回对象,因为最终回调将在主线程上,我不想返回NSManagedObjectID,我想返回NSManagedObject,但我不知道这是否安全。

1 个答案:

答案 0 :(得分:1)

安全吗?我不这么认为。

相反,您应该在完成块中创建子上下文,并在块中保存所有Core Data。

childContext.performBlockAndWait() {
    // parse, insert and save
}

请记住,储蓄只会推动"变化直到主要背景。您仍然需要将它们保存到持久性存储中。主要上下文应该自动了解任何更改(通过NSFetchedResultsControllerDelegateNSNotificationCenter)。

我的数据管理器类(或应用程序委托)中有一个额外的便捷方法,用于将数据保存到持久性存储,类似于Apple模板提供的普通的saveContext方法。这应该是一种可以通过上面的块API安全地从任何地方安全调用的方法来保存上下文。