Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa 需要很长时间才能打开的基于文档的核心数据应用程序的最佳做法_Cocoa_Core Data_Bigdata_Nsdocument - Fatal编程技术网

Cocoa 需要很长时间才能打开的基于文档的核心数据应用程序的最佳做法

Cocoa 需要很长时间才能打开的基于文档的核心数据应用程序的最佳做法,cocoa,core-data,bigdata,nsdocument,Cocoa,Core Data,Bigdata,Nsdocument,我有一个OS X Cocoa应用程序(10.8-10.9),它可以打开大约2 Gb或更大的非常大的NSDocument(支持核心数据)文件。文档的初始加载大约需要20-40秒,但是很快就会完成。20-40秒的时间与良好的UI体验并不完全一致,因此我想解决这个问题 我希望A)加快文档打开速度,或B)显示“加载”屏幕 我想知道人们做了什么(如果有的话)来A)加快打开核心数据文档的速度(即使它是在后台进行的)或B)在打开过程中显示启动屏幕/进度条 WRT to B)(这不是一个由两部分组成的问题,实际

我有一个OS X Cocoa应用程序(10.8-10.9),它可以打开大约2 Gb或更大的非常大的NSDocument(支持核心数据)文件。文档的初始加载大约需要20-40秒,但是很快就会完成。20-40秒的时间与良好的UI体验并不完全一致,因此我想解决这个问题

我希望A)加快文档打开速度,或B)显示“加载”屏幕

我想知道人们做了什么(如果有的话)来A)加快打开核心数据文档的速度(即使它是在后台进行的)或B)在打开过程中显示启动屏幕/进度条


WRT to B)(这不是一个由两部分组成的问题,实际上,只是想证明我已经做了研究)如果在调用windowControllerWillLoadNib和windowcontrolleridloadnib方法时,在NSDocument类中创建方法会起作用,但只有在打开第一个文档之后(我确信有一个解决方法)。无论如何,我看不出有什么“进展”可以建立一个钩子。

试着在后台线程上打开商店,一旦它打开,激活用户界面-这似乎可以

我创建了一个后台线程来调用[psc addPersistentStoreWithType:configuration:URL:options:error:],完成后,我将控制权交还给主线程,在主线程中创建managedObjectContext并启用UI

如果核心数据也必须对新的模型版本进行大的升级,那么您将面临这个问题。我的一些文件大约需要一分钟,如果它们在iCloud中,可能会更长。如果升级发生在iOS设备上,则可能需要几分钟的时间,因此这对于iOS应用程序似乎也很重要

顺便说一句,我在这里发布了示例应用程序

除了Duncan给你的具体提示外,查看最新(免费)的WWDC视频,了解OS X和Cocoa提供的模式,尤其是提高应用程序性能的模式,总是很有用的。一些出发点:


-具有块、GCD和XPC的异步设计模式



-为性能设计代码

什么是-GetLociWithChromomes:做的?当您在仪器中钻研该方法以了解一直在使用的是什么时,会发生什么

-getAllLocals:
-getMaxRocussNPS
相同的问题

从我所能看到的少量数据来看,您在启动时正在进行大量的抓取。无论你在什么平台上,这都是一个糟糕的设计。您应该避免在文档启动期间进行大量的获取,并将其延迟到初始文档/应用程序启动完成之后

您可以在这里使用多线程设计,这可能会有所帮助,但它实际上掩盖了问题

问题的核心似乎是您在发布时试图做得太多。我不确定整个延迟是否存在于核心数据中,也不确定一旦检索到数据,您将如何处理这些数据,因为我没有通过您提供的跟踪进行代码级访问。在突出显示时间百分比的仪器中看到上述方法的屏幕截图会很有趣

使现代化
同样,您在启动过程中加载了太多内容并阻塞了UI。你有三个答案都在说同样的基本问题。这不是一个核心数据问题。这是一个性能问题,因为您在发射时加载太多,或者在发射时计算太多。

仪器告诉您什么?哪里慢?这是最佳实践的第一步。运行仪器证实了我的怀疑,这是一系列非常长的核心数据调用_populateRowValuesOnBackgroundThread(CoreData)和[NSKeyedUnarchiver unarchiveObjectWithData:]占用了大部分开始调用时间。发布仪器跟踪将有助于确定潜在的解决方案。仅仅说“核心数据”不允许任何人帮助您解决问题。你的模型里有什么?有二进制数据吗?细节很重要。我的核心数据数据库是标准sqlite。有5个模型对象。在这些对象中,最大的具有多个NSData(基因组序列数据)。这是gzip压缩的JSON,呈现为HTML。这是跟踪文件(无法在注释中发布所有文本):下面是核心数据跟踪。长话短说,在应用程序加载之前进行30-40秒的获取。最有可能的解决方案是使用URL:ofType:error为NSDcoumentController的内容覆盖MakeDocument并连接到初始屏幕。启动时抓取是因为它重新打开了最后一个文档(它是一个基于文档的应用程序)。我可以专门解决这个问题,但我仍然有一个问题,即当打开文件需要很长时间,而用户没有收到文件正在打开的指示时,打开文件需要很长时间,而用户没有收到文件正在打开的指示<代码>-GetAllLocals获取所有轨迹对象(超过100K)<代码>GetMaxRocussNPS。。。调用
-getAllLocals
,从每个位置提取NSData对象,然后提取并执行简单计算(看到一个红色标志!)。
-getLociWithCooms
getSalLocals,带有两个谓词:sprediate*predicate1=[NSPredicate predicateWithFormat:@“chrome!=nil”];NSPredicate*predicate2=[NSPredicate predicateWithFormat:@“染色体!=''”;[request1 setPredicate:predicate1];[request1 setPredicate:predicate2];很抱歉,答复耽搁了很长时间。这是最接近的答案。通过在“opendocument”代码中执行单个查询而不是循环,肯定会有一些加速。谢谢