具有网络和多线程的 iOS CoreData

标签 ios swift multithreading networking core-data

这是关于理解同时使用 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/

相关文章:

ios - 以编程方式更改现有的 UIBlurEffect UIBlurEffectStyle?

ios - 创建 spritenodes 时 Swift 游戏滞后

json - 使用 Swift 可解码解析 JSON 字典时出错

java - Java中如何实现多个线程下载单表数据?

python - 什么时候需要 Queue.join() ?

ios - 某些音频文件未使用 AVPlayer swift 4 播放

ios - Swift 如何通过按钮将我的 Tableview Cells accessoryType 重置为 .None

c# - 使用 FileSystemWatcher 时 c# GUI 中的内存不足异常 - 多线程

ios - App Transport Security 异常域是否可以在运行时修改?

ios - 获取应用内购买自动续订订阅结束日期的最佳策略