繁体   English   中英

iOS:使用CoreData聊天应用程序

[英]iOS: Chat application with CoreData

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

该应用程序的流程是;

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

问题

  1. 收到聊天后,UI会挂起一段时间(在iPhone 4中为1-2秒)。 (如果我暂停执行,则表明获取控制器委托的[tableview endUpdate]中发生了某些情况)
  2. 要在聊天视图中转到最新的聊天,当前用户必须从数据库加载所有聊天

问题

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

  2. 如何使用fetchresultcontroller以分页方式(例如sup或viber)加载聊天。

  3. 如果我将后台模式与多个托管对象上下文一起使用,性能会有所改善吗?
  1. 甚至使用NSFetchedResultsController也非常好,它是针对此类操作而设计的。
  2. 批次大小有点像分页。 看一下这篇文章 ,第一个答案显示了如何使用限制和批量大小(例如分页)。
  3. 根据您的意思,可以在后台线程中很好地处理对核心数据的更新/保存(我建议这样做)。 获取是另一回事,请记住, 所有UI更改都必须在主线程上完成。

最好将数据突变和数据获取视为两个单独的任务,这样您就可以同时优化它们。 我强烈考虑阅读本文 ,以获取有关此问题的更多信息:

CoreData专家Marcus Zarra向我展示了以下基于上述Parent / Child方法的方法,但是添加了专门用于写入磁盘的其他上下文。 如前所述,冗长的写入操作可能会在短时间内阻塞主线程,从而导致UI冻结。 这种聪明的方法将写入分离到其自己的专用队列中,并保持UI平滑为按钮。 在此处输入图片说明

您将需要在后台线程上处理CoreData。 那里有很多示例( 这里是一个 ),但是我的建议是使用MagicalRecord ,它使CoreData并发操作真的很容易。

所有核心数据操作均在主线程中完成

这是你的问题。 仅通过NSFetchResultController进行的对象访问应位于主线程上。 更新NSManagedObject S的关系在后台排队进行了并发孩子NSManagedObjectContext

对于你的问题2。

创建一个新的数组-chatArray-并从数据库中进行最后20个聊天,然后使用chatArray加载聊天表视图。 在Tableview标头上显示更多加载按钮,然后当用户到达顶部并点击该按钮时-

从chatArray中删除所有对象,并从数据库中添加最后20条聊天记录,然后再次重新加载表。 这个过程继续进行。

我不擅长fetchresultcontroller,将进行一些研究,并让您确定。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM