这是关于理解同时使用 UI、CoreData 和网络的方法的问题。关于我的应用程序的一些话:它是 CoreData 存储的简单任务列表,并通过 TCP 协议(protocol)检索/发送更改。
以 UIViewController
和委托(delegate) 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 实例,而应该在主线程之外使用私有(private) 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 */ }
}
}
}
我对这种方法有一些问题,但主要问题是:我是否应该在每个网络事件上创建新的私有(private) MOC 并执行我的操作抛出 performBlock
,否则它就足够了整个网络对象的 MOC?
最佳答案
您需要一个全局 MOC,因为 CoreData 只有一个“库”。我不久前遇到了这个问题,是的,您可以使用多个私有(private)实例,但您必须确保两个线程或事件不会同时访问或更改数据。您可以使用信号量来缓解这一问题,但为了简单明了,我会使用一个全局 MOC。
关于具有网络和多线程的 iOS CoreData,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40773024/