objective-c – 重置Core Data驱动的treeController内容

objective-c – 重置Core Data驱动的treeController内容,第1张

概述我运行我的程序,创建使用 NSTreeController在 NSOutlineView中显示的核心数据内容.第二次运行我的程序时,我想清理我的NSTreeController的内容,然后运行下面粘贴的方法.该方法要么在完成之前挂起很长时间(600秒),要么崩溃.如果我的NStreeController中有很少的实体(500-1000),那么与我有很多(200,000)个实体传递此方法相比,如果它 我运行我的程序,创建使用 NSTreeController在 NSOutlineView中显示的核心数据内容.第二次运行我的程序时,我想清理我的nstreecontroller的内容,然后运行下面粘贴的方法.该方法要么在完成之前挂起很长时间(600秒),要么崩溃.如果我的nstreecontroller中有很少的实体(500-1000),那么与我有很多(200,000)个实体传递此方法相比,如果它完全通过则需要更少的时间.我需要知道的是,在重新运行程序并再次填充nstreecontroller之前,是否有更好的方法来清除/刷新/重置我的nstreecontroller的内容以清除我的NSoutlineVIEw.具体来说,我希望我的NSOutlineVIEw能够快速响应我的nstreecontroller内容的更改,并且我需要能够重置我的Core Data驱动的nstreecontroller的内容.

-(voID) cleanSDRDfileObjects{    __weak __typeof__(self) weakSelf = self;    dispatch_async(dispatch_get_main_queue(),^{             [weakSelf.outlineVIEw collapseItem:nil collapseChildren:YES];        [weakSelf.coreDataController._coreDataHelper.context  performBlockAnDWait:^{            NSEntityDescription *entityDescription = [NSEntityDescription                                                  entityForname:@"SDRDfileObject"                                        inManagedobjectContext:weakSelf.coreDataController._coreDataHelper.context];            NSFetchRequest *request = [[NSFetchRequest alloc] init];            [request setEntity:entityDescription];            NSArray * result = [weakSelf.coreDataController._coreDataHelper.context  executeFetchRequest:request error:nil];            for (ID fileobject in result){                [weakSelf.coreDataController._coreDataHelper.context deleteObject:fileobject];            }            [weakSelf.coreDataController._coreDataHelper.context processpendingChanges];            NSLog(@"Finished deleting all objects");        }];    }); }

managedobjectcontext(context)作为类型NSMainQueueConcurrencyType运行,并且该方法在主线程上运行.有关改进的建议,或重置/刷新NSOutlineVIEw核心数据组合的有用示例将不胜感激.谢谢.干杯,特隆德

为了回应@TomHarringtons的问题,我拍了一张Time Profiler的照片.我真的不明白为什么它挂在这个方法上,然而,在评论这个方法(“`processpendingChanges“`)后,它仍然挂起并需要永远完成(6分钟).似乎这个过程卡在主线程上并且无法继续.

当我重新运行应用程序时,processpendingChanges注释掉它仍然挂起.

更新

我相信我已经解决了这个问题,但我对于为什么会这样做有点不确定.似乎我的第一个方法进入了一个无法释放其对象的无限循环.以下简单的解决方案有效:

__weak __typeof__(self) weakSelf = self;     dispatch_sync(dispatch_get_main_queue(),^{         [weakSelf.coreDataController._coreDataHelper.context reset];      });

我确信要正确清空托管对象上下文,我必须单独删除每个实体.重置功能似乎相当暴力,它实际上是否清理内存并确保一切正常?如果有人想对此有所了解,那将是值得赞赏的.

解决方法@H_419_32@ 再看一遍,你在performBlockAnDWait中获取了一个类型的所有对象 – 这会阻塞主线程,因为你有mainQueueConcurrency而你使用了andBait版本的performBlock.

然后逐个删除每个对象.这些对象位于附加了outlinevIEw的树数据结构中(请参阅堆栈跟踪中的KVO消息).这些对象有许多需要由核心数据维护的关系,地狱,你甚至可以有一个级联删除规则. (请参阅堆栈跟踪中的propagateDelete和maintainInverseRelationship)无论如何,在主线程上开始请求数据源和视图开始执行大量工作.如果要迭代后台中的所有对象,可以尝试使用带有privateQueueConcurrency的子MOC.

但是,如同评论所示:

NSManagedobjectContext的重置绝对可以释放内存,而且你可以在这里做的事情很好:把一切都搞砸了.

然而,这就引出了为什么你首先从磁盘上的商店加载模型的问题.

如果您需要Core Data,但不需要在运行程序的时间之间保持持久性,则可以使用NSInMemoryStoreType存储来初始化persistentStoreCoordinator,而不是将其指向文件URL.

总结

以上是内存溢出为你收集整理的objective-c – 重置Core Data驱动的treeController内容全部内容,希望文章能够帮你解决objective-c – 重置Core Data驱动的treeController内容所遇到的程序开发问题。

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

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

原文地址:https://54852.com/web/1016304.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存