这是一个design question
,以下是我的问题的背景。
问题
我正在写一个新闻应用程序。
我从一个提要下载了一些新闻项目(一个项目有标题、内容、图像等)。然后我将所有项目存储到一个CoreData db
.
同时,我可能会从数据库中获取项目并在 UI 上显示它们。
我了解 CoreData 数据库操作(尤其是在繁重的情况下)可能会影响和滞后 UI,因此我想将所有 CoreData 操作放入NSOpeartionQueue
最低线程优先级。例如,一个典型的操作可能是获取一个提要的所有项目并使它们为 UI 做好准备。
由于 CoreData 不是线程安全的,并且操作和主线程中的上下文不同,所以问题来了:如何将这些项目提供给主线程,以便主线程可以相应地更新 UI?
提议
我有两种可能的解决方案。
第一个解决方案是,对于每个 NSManagedObject 项目,我创建一个与任何上下文无关的新项目,然后将所有新闻项目返回主线程。然后主线程使用这些新项目作为使用非 NSManagedObject。该解决方案有一个缺点:内存成本。我必须将所有获取的项目的内存加倍。
第二种解决方案是,在 NSOperation 中获取时,除了这些项目的 objectId 之外,我不获取任何其他内容。然后将所有 objectIds 交给主线程,主线程可以从自己的上下文中读取所有真正的 NSManagedObject 项。此解决方案也有一个缺点:UI 可能滞后。由于读取db真的会在主线程中再次发生,我担心读取会影响UI。
任何人都可以给我一些建议吗?
谢谢