我正在使用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,但我不知道这是否安全。
答案 0 :(得分:1)
安全吗?我不这么认为。
相反,您应该在完成块中创建子上下文,并在块中保存所有Core Data。
childContext.performBlockAndWait() {
// parse, insert and save
}
请记住,储蓄只会推动"变化直到主要背景。您仍然需要将它们保存到持久性存储中。主要上下文应该自动了解任何更改(通过NSFetchedResultsControllerDelegate
或NSNotificationCenter
)。
我的数据管理器类(或应用程序委托)中有一个额外的便捷方法,用于将数据保存到持久性存储,类似于Apple模板提供的普通的saveContext
方法。这应该是一种可以通过上面的块API安全地从任何地方安全调用的方法来保存上下文。