【问题标题】:iOS CoreData with Network and multiple threads具有网络和多线程的 iOS CoreData
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 我想使用唯一的一个 MOC,但这里的主要问题是我应该只能从一个线程访问这个 MOC,而且在我的体系结构中并不那么容易(甚至不确定)。我在某处读到,带孩子的 MOC 可以自动解决这个冲突,如果我应该手动处理它,我无法理解这种方法的任何好处。
猜你喜欢
  • 2019-11-03
  • 1970-01-01
  • 2010-09-13
  • 1970-01-01
  • 1970-01-01
  • 2016-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多