2015-09-15 23 views
0

我正在使用AFNetworking来解析一些数据,然后保存到CoreData,我想要做这样的事情。将NSManagedObject(在主要上下文中创建)从后台线程传递到主线程是否安全?

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

安全吗?我不认为这是。

相反,您应该在完成块中创建一个子上下文,并在块内完成所有核心数据保存。

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

请记住,保存只会将更改推送到主要上下文。您仍然必须将它们保存到持久存储中。主要内容应自动识别任何更改(通过NSFetchedResultsControllerDelegateNSNotificationCenter)。

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

相关问题