这是一个面向观点问题。我能做的最好的事情就是让你知道我过去如何设计我的应用程序来处理这种情况。
我的解决办法:
使用NSFetchedResultsController
来读取核心数据的数据,并使用NSFetchedResultsController的fetchedObjects
阵列作为数据源到您的UITableViewController
或UICollectionViewController
实施的NSFetchedResultsController
代表这将Core数据中的数据更改时触发。这样你可以有效地更新你的CollectionView
和TableView
并在UI ASAP上显示数据变化。
使用背景上下文来修改数据的方式你的主线程将是免费的应用保持响应。
为了创建背景情况下,我更喜欢父子背景架构,而不是传统的多语境架构。亲子上下文架构很容易理解,保持代码清洁。
切勿将图像保存到核心数据中。而是将下载的图像保存到文档目录,并将相关链接保存到CoreData中的下载文件中。
还记得我说过要删除的文件不是绝对的文件相对路径。因为您的应用程序文件夹/沙箱路径在杀死和重新启动应用程序时发生变化。在核心数据中保存文件的绝对路径是彻底解决逻辑问题的好办法。
不要担心在数据保存到核心数据的延迟。延迟可能只有几秒钟,你甚至不会注意到。将数据保存在一个数组中,然后从核心数据中获取数据并更新数组是一个完整的no。
就个人而言,使用阵列来保存数据,而不是NSFetchedResultsController的fetchedObjects是一个完整的NO。为什么?简单来说,数组不是线程安全的,因为您将后台线程作为Web服务调用和解析数据,您可能有多个线程同时访问数组。由于Array不是线程安全的,因此您可能很容易进入数据不一致状态,并且可能导致崩溃。
最后使用像SDWebImage这样的库来有效地加载图像。 SDWebImage不仅可以加载图像,还可以通过快速,快速地加载图像,在各种级别(RAM和HardDisk中)缓存图像。
如果你打算使用分页来获取数据,使用scrollViewDidScroll
滚动视图的委托,当用户滚动找出表/的CollectionView的底部,使Web服务调用,并获取在后台线程更新的核心数据。只要更新mainObjectContext,NSFetchedResults控制器的委托将被触发,并且您应该能够立即更新UI。
我喜欢先放映,然后保存。保存不是廉价的操作,应该在后台队列中执行,所以我们不能等到它完成。 – Akki
感谢您的意见Akki –