【发布时间】:2016-04-10 15:43:45
【问题描述】:
我正在开发一个连接到网络服务的应用程序,该服务在应用程序启动期间检索大量数据。我使用并发来避免 UI 阻塞。我选择了以下核心数据堆栈模式:background private moc —> main moc —> writer private moc —> coordinator —> file。
在导入操作时会出现问题。 CPU 已 100% 使用,应用程序在此过程中变慢。我处理了 300 个对象的批次,总共导入了大约 10,000 个对象。
对于每个批次,都会创建一个 NSOperation,并带有一个关联的临时 moc,即背景 moc 的子代。操作在 NSOperationQueue 中排队。 导入作业完成后,应用程序会变得更慢,具体取决于正在运行的作业数量。我还注意到,当应用程序被终止并重新启动时,它确实更加可用和快速。
导入时我的内存占用在 40Mo 和 60Mo 之间变化。是不是觉得太过分了?
您认为我的堆栈模式是否适合我的需求?我应该迁移到有 2 个协调器的堆栈吗?
此外,在获取要在 tableView 中显示的数据时,我应该在显示视图之前立即使用 performBlockAndWait 获取数据吗?
感谢您的帮助
【问题讨论】:
-
你能贴一些代码吗?
-
永远不要让作家通过主 moc 到达协调员。保存堆栈时,您将失去所有性能提升。
-
感谢您的回答。所以我应该设置 writer context 的 background context child 并让 main context 直接链接到 coordinator ?但是根据@MattMorey 的说法,作者应该是主要speakerdeck.com/player/360691a030570131a0a76af09d9fc329# 的父母,错了吗?
-
@Avi,他的作者上下文没有通过主要上下文。根据他的描述,他的堆栈是正常的父子设置。
-
@MarcusS.Zarra,我的意思是执行导入的线程。它本质上是这个过程的作者。
标签: ios objective-c performance core-data concurrency