iOS:使用CoreData聊天应用程序

时间:2014-03-05 10:35:54

标签: ios objective-c core-data chat nsfetchedresultscontroller

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

应用程序的流程是;

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

    问题

    1. 收到聊天时,用户界面会暂停一段时间(1 - 在iPhone 4中2秒)。 (如果我暂停执行它会显示那里 是fetch控制器中[tableview endUpdate]中发生的事情 代表)
    2. 要转到当前用户必须的聊天视图中的最新聊天 加载来自DB的所有聊天
    3. 问题

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

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

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

4 个答案:

答案 0 :(得分:11)

  1. 即使使用NSFetchedResultsController也非常好,它专为此类操作而设计。
  2. 批量大小有点像分页。看一下this post,第一个答案显示如何使用限制和批量大小,如分页。
  3. 取决于你的意思,更新/保存到核心数据可以很好地在后台线程中处理(我建议这样做)。提取是一个不同的故事,请记住all UI changes have to be be done on the main thread.
  4. 最好将数据变异和数据提取视为两个独立的任务,这样您就可以在途中优化它们。我高度考虑阅读this article以获取有关此事的更多信息:

      

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

答案 1 :(得分:3)

您需要在后台线程上执行CoreData内容。这里有很多例子(here's one),但我的建议是使用MagicalRecord,它使CoreData并发操作变得非常简单。

答案 2 :(得分:0)

  

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

这是你的问题。只有通过NSFetchResultController的对象访问才能在主线程上。更新NSManagedObject应在具有并发子NSManagedObjectContext的后台队列上完成。

答案 3 :(得分:0)

对于你的问题2。

您创建一个新阵列-namely chatArray - 并从您的数据库中获取最后20个聊天记录,然后使用chatArray加载聊天表视图。 在Tableview标题上显示一个加载更多按钮,当用户到达顶部并点击该按钮时 -

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

我在fetchresultcontroller中并不强大,并会做一些研究并让你知道。