iOS:使用CoreData聊天应用程序

Cle*_*rem 0 chat core-data objective-c nsfetchedresultscontroller ios

我正在为iOS开发一个聊天应用程序.该应用程序将允许用户创建聊天室并与聊天室中的成员聊天(如IRC聊天室).

应用程序的流程是;

  1. 用户可以加入聊天室
  2. 消息将存储在coradata支持的SQLite DB中
  3. 本地消息和服务器中的消息没有引用(与特定用户相关的所有消息仅存储在其本地数据库中)
  4. 我正在使用NSFetchResultController来更新和刷新聊天表.收到聊天时,它将存储到DB,表视图将加载新聊天.
  5. 所有核心数据操作都在主线程中完成
  6. batchsize用于取请求是20和performfetch方法被称为在viewDidLoad

问题

  1. 当收到聊天时,UI会挂起一段时间(iPhone 4中为1-2秒).(如果我暂停执行,则表明在fetch controller delegate中的[tableview endUpdate]中发生了某些事情)
  2. 要在聊天视图中转到最新聊天,用户必须从DB加载所有聊天

问题

  1. 有没有更好的方法来处理这个要求?是否可以使用fetchresultcontroller?

  2. 如何以分页的方式加载聊天 - 比如sup或viber - 使用fetchresultcontroller.

  3. 如果我使用具有多个托管对象上下文的后台模式,是否会有任何性能改进?

Kev*_*n R 12

  1. 即使使用NSFetchedResultsController也非常好,它专为此类操作而设计.
  2. 批量大小有点像分页.看一下这篇文章,第一个答案显示了如何使用限制和批量大小,如分页.
  3. 取决于你的意思,更新/保存到核心数据可以很好地在后台线程中处理(我建议这样做).提取是一个不同的故事,请记住,必须在主线程上完成所有UI更改..

最好将数据变异和数据提取视为两个独立的任务,这样您就可以在途中优化它们.我高度考虑阅读本文以获取有关此事的更多信息:

CoreData大师Marcus Zarra向我展示了以下方法,该方法基于上述父/子方法,但增加了一个专门用于写入磁盘的附加上下文.如前所述,长时间写入操作可能会在短时间内阻塞主线程,从而导致UI冻结.这种智能方法将写入解耦为自己的私有队列,并使UI保持平滑按钮.在此输入图像描述