首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS:使用CoreData的聊天应用程序

iOS:使用CoreData的聊天应用程序
EN

Stack Overflow用户
提问于 2014-03-05 10:35:54
回答 4查看 3.2K关注 0票数 1

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

应用程序的流程是;

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

问题

  1. 当接收到聊天时,UI挂起一段时间(在iPhone 4中为1-2秒)。(如果我暂停执行,它会显示在获取控制器委托中的tableview endUpdate中发生了一些事情)
  2. 要在当前的聊天视图中找到最新的聊天,用户必须从DB加载所有的聊天。

问题

  1. 有什么更好的方法来处理这个要求吗?使用取结果控制器可以吗?
  2. 如何以分页的方式加载聊天,-like,sup或viber -使用fetchresultcontroller
  3. 如果我在多个托管对象上下文中使用后台模式,性能会有任何改善吗?
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-03-05 10:57:24

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

最好将数据突变和数据获取作为两个独立的任务来考虑,这样您就可以对两种任务进行优化。我高度考虑阅读这篇文章以获得更多有关此事的信息:

CoreData古鲁马库斯·扎拉向我展示了以下方法,它构建在上述父/子方法的基础上,但是添加了一个专门用于写入磁盘的附加上下文。正如前面提到的,宽松的写操作可能会在短时间内阻塞主线程,导致UI冻结。这种智能方法将写入到它自己的私有队列中,并保持UI平滑为按钮。

票数 13
EN

Stack Overflow用户

发布于 2014-03-05 10:43:13

您需要在后台线程上执行CoreData操作。有很多例子(这里有一个)可以实现这一点,但是我的建议是使用MagicalRecord,这使得CoreData并发操作非常容易。

票数 3
EN

Stack Overflow用户

发布于 2014-03-05 10:42:15

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22195212

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档