【发布时间】:2016-11-23 19:50:51
【问题描述】:
这是关于理解同时使用 UI、CoreData 和网络的方法的问题。关于我的应用程序的一些话:它是 CoreData 存储的任务的简单列表,并通过 TCP 协议检索/发送更改。
显示为UIViewController 和委托NSFetchedResultsControllerDelegate 的任务列表。
我在AppDelegate 中初始化了CoreData 堆栈,并将managedObjectContext 的实例传递给我的UIViewController:
lazy var managedObjectContext: NSManagedObjectContext = {
let coordinator = self.persistentStoreCoordinator
var managedObjectContext = NSManagedObjectContext(concurrencyType: .MainQueueConcurrencyType)
managedObjectContext.persistentStoreCoordinator = coordinator
return managedObjectContext
}()
我仔细阅读了about CoreData Concurrency 并注意到我不应该在线程之间传递NSManagedObject 实例,并且应该在主线程之外使用私有MOC。因此,在我的单音网络对象(也有指向主 managedObjectContext 的链接)中,当应用程序收到一些我需要存储的数据时,我实际上会执行以下操作:
func processObject(objectID: NSManagedObjectID, callback: () -> Void){
let privateMOC = NSManagedObjectContext(concurrencyType: .PrivateQueueConcurrencyType)
privateMOC.parentContext = self.managedObjectContext
privateMOC.performBlock {
if let object = privateMOC.objectWithID(objectID) as? MyItem {
object.someProperty = "SomeValue"
do {
try privateMOC.save()
} catch { /* Something to say our user */ }
}
}
}
我对这种方法有一些问题,但主要问题是:我是否应该在每个网络事件上创建新的私有 MOC 并执行我的操作 throw performBlock 或者一个私有 MOC 就足够了整个网络对象?
【问题讨论】:
-
实际上我注意到只有在我保存两个类似 described here 的上下文之后,一切才开始工作。它甚至合法吗?
-
对于那些想要检查他们的私有 MOC 是否可以从正确的线程read this awesome article 访问的人。
标签: ios swift multithreading networking core-data