gpt4 book ai didi

具有网络和多线程的 iOS CoreData

转载 作者:行者123 更新时间:2023-11-30 12:52:38 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com