这是关于对同时使用UI,CoreData和Network的方法的理解的问题。关于我的App的一些话:它是由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并执行performBlock动作,还是为整个Network对象创建一个私有MOC就足够了?

最佳答案

您将需要一个全局MOC,因为CoreData只有一个“库”。不久前,我就遇到了这个问题,是的,您可以使用多个私有实例,但是您必须确保两个线程或事件不会同时访问或更改另一个数据。您可以使用信号量来缓解这种情况,但是为了简单明了,我将使用一个全局MOC。

关于ios - 具有网络和多个线程的iOS核心数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40773024/

10-12 01:49