在我的应用程序中,我有一个“主”NSPrivateQueueConcurrencyType 上下文,它充当 View Controller 所依赖和传递的 NSMainQueueConcurrencyType 上下文的父级。我想这样做是为了利用异步保存(这个应用程序使用 iCloud 和 Core Data,保存做大量工作导出无处不在的日志)。该设置类似于 this article 底部提到的 Zarra 方法。
应用内的保存通常如下所示:
[context save:nil];
[context.parentContext performBlock:^{
[context.parentContext save:nil];
}];
这似乎适用于小型编辑/更新,但我对删除许多对象时看到的内容感到困惑(例如,删除具有数百个与之相关的任务对象的项目)。
在那种情况下,保存是异步的,但看起来主线程进入了信号量等待状态(如我暂停调试器时所见)并且被有效阻止(我无法在 UI 中滚动)直到后台私有(private)上下文完成保存。
实际上,我只是注意到,尽管采用了异步保存模式,但对单个对象的滑动删除操作会产生明显的延迟,因此应用程序中的所有删除操作似乎都很慢。
或者,如果我分配一个新的 NSPrivateQueueConcurrencyType 上下文,将其持久存储协调器设置为 AppDelegate 中的主 PSC,并执行删除和保存,它仍然会做很多工作,但是UI 永远不会被阻塞(但我不得不担心协调上下文,在主上下文中重新获取)。
知道我可能做错了什么,或者您是否也看到过这种行为?
最佳答案
删除可能需要很长时间。他们必须修复所有的关系。进行大量删除时,您应该做几件事。
首先,当删除在后台发生时,为什么您的 UI 会阻塞?因为那个后台线程真的忙于执行删除 block ,并且您的 UI 正在尝试在删除发生时获取更新数据。
运行实际工作的线程由 FIFO 队列管理,因此如果您给它执行一个大任务,它在长时间运行的任务完成之前将无法执行其他任务。
您可能正在使用 FRC,它会尝试在对象和关系发生变化时获取更新。
如果您有一个大的删除,您可能想要更改您的提取,以便它只在删除发生时查看当前 MOC 的数据。删除完成后,您可以告诉获取请求返回到一直查询到商店本身。
此外,当删除大量内容时,最好在自动释放池内、在单独的线程中以小块的形式进行。从该后台线程,一次删除小块,并使用 performBlockAndWait 执行此操作。这样,您就不会用删除请求加载工作线程的队列,并且您的 UI 线程可以处理它的请求。更快。
或者,您也可以使用 GCD 的高级功能来拥有高优先级和低优先级队列,用于将工作馈送到工作线程。您可以将写入放在低优先级队列中,将读取放在高优先级队列中。
关于ios - 在嵌套的 NSManagedObjectContext 中缓慢删除和保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11801459/
我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib
这道题是thisquestion的逆题.给定一个散列,每个键都有一个数组,例如{[:a,:b,:c]=>1,[:a,:b,:d]=>2,[:a,:e]=>3,[:f]=>4,}将其转换为嵌套哈希的最佳方法是什么{:a=>{:b=>{:c=>1,:d=>2},:e=>3,},:f=>4,} 最佳答案 这是一个迭代的解决方案,递归的解决方案留给读者作为练习:defconvert(h={})ret={}h.eachdo|k,v|node=retk[0..-2].each{|x|node[x]||={};node=node[x]}node[
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html
我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的
我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查
这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下
下面例子中的Nested和Child有什么区别?是否只是同一事物的不同语法?classParentclassNested...endendclassChild 最佳答案 不,它们是不同的。嵌套:Computer之外的“Processor”类只能作为Computer::Processor访问。嵌套为内部类(namespace)提供上下文。对于ruby解释器Computer和Computer::Processor只是两个独立的类。classComputerclassProcessor#Tocreateanobjectforthisc
我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的
我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的