ios – Magical Record在单独的线程中创建获取实体

ios – Magical Record在单独的线程中创建获取实体,第1张

概述我有一堆NSOperations需要在队列中运行时创建和获取实体. >在NSOperations中创建实体时,我可以简单地使用默认上下文创建,或者因为我在一个不在主线程上的新线程,这是不允许/建议的?如果我在这个线程上创建一个新实体,那么将它合并回默认上下文然后(而不是保存到商店)的最佳方法是什么? >在获取这些线程时,我需要获取然后更新该实体中的数据.我不知道如何做到这一点然后合并到默认上下文. 我有一堆NSOperations需要在队列中运行时创建和获取实体.

>在NSOperations中创建实体时,我可以简单地使用默认上下文创建,或者因为我在一个不在主线程上的新线程,这是不允许/建议的?如果我在这个线程上创建一个新实体,那么将它合并回默认上下文然后(而不是保存到商店)的最佳方法是什么?
>在获取这些线程时,我需要获取然后更新该实体中的数据.我不知道如何做到这一点然后合并到默认上下文.

或者,当您保存时,您获取/创建的线程无关紧要?

我说上面的默认上下文,因为我有NSFetchedResultsControllers监视更新和插入的默认上下文.目前我的解决方案是在主线程上完成所有这些工作,但是应用程序现在开始爬行,现在正在通过它运行大量数据.

我还有一个类监控(通过KVO) *** 作队列计数.一旦它变为零,我就预先形成一个保存.我宁愿只在完成所有上述NSOperations后执行,就像我现在正在执行的那样.感谢您的帮助.

解决方法 我们暂时忽略MagicalRecord.要在多个线程上使用Core Data,您需要了解一些事情.

>永远不要在线程之间传递NSManagedobject.相反,传递所需对象的NSManagedobjectID,并在后台线程中重新获取它.
>负责任地构建NSManagedobjectContext.这意味着您必须了解initWithConcurrencyType:的含义.我们将进入那个.

主线程

您的主NSManagedobjectContext应使用并发类型NSMainQueueConcurrencyType构建.这将允许您利用内置队列中的上下文来执行串行 *** 作.每当后台线程与主上下文交互时,您应该使用performBlock或performBlockAnDWait来完成工作.

- (NSManagedobjectContext *)managedobjectContext {    if (_managedobjectContext != nil) {        return _managedobjectContext;    }    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];    if (coordinator != nil) {        _managedobjectContext = [[NSManagedobjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];        [_managedobjectContext setPersistentStoreCoordinator:coordinator];    }    return _managedobjectContext;}

背景线程

无论何时在后台线程中工作,都需要启动新的上下文.您不应该在线程之间共享上下文.将对主线程上下文的引用传递到 *** 作中,并在 *** 作开始后构建后台上下文.这将确保它构建在您将执行工作的线程上.

- (NSManagedobjectContext *)newBackgroundManagedobjectContext{        // Create new context with private concurrency type    NSManagedobjectContext *newContext = [[NSManagedobjectContext alloc] initWithConcurrencyType:nsprivateQueueConcurrencyType];    [newContext setParentContext:self.mainContext];    // Optimization    [newContext setUndoManager:nil];    return newContext;}

将此背景上下文视为便笺簿.无论你做什么,都会留在那里,直到你拯救.由于您设置了parentContext,因此对背景上下文的保存会将更改合并到主上下文中.这将更新NSFetchedResultsController,但由于您没有调用save,因此数据尚未保留.在队列KVO中,您可以通过排队保存块来调用主上下文中的保存.

[self performBlock:^{    NSError *error;    [self save:&error];    if (error) {        // handle errors    }}];
总结

以上是内存溢出为你收集整理的ios – Magical Record在单独的线程中创建/获取实体全部内容,希望文章能够帮你解决ios – Magical Record在单独的线程中创建/获取实体所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1076448.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存