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

iOS:使用CoreData的聊天应用程序,ios,objective-c,core-data,chat,nsfetchedresultscontroller,Ios,Objective C,Core Data,Chat,Nsfetchedresultscontroller,我正在为iOS开发聊天应用程序。该应用程序将允许用户创建聊天室,并在聊天室(如IRC聊天室)中与成员聊天 应用程序的流程是: 用户可以加入聊天室 消息将存储在数据备份的SQLite中 分贝 本地消息和所有服务器中的消息都没有引用 与特定用户相关的消息仅存储在其本地数据库中 我正在使用NSFetchResultController更新和刷新聊天记录 桌子当收到聊天记录时,它将被存储到数据库中,表格视图将加载新的聊天记录。 所有的核心数据操作都在主线程中完成 获取请求的batchsize为20,pe

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

应用程序的流程是:

用户可以加入聊天室 消息将存储在数据备份的SQLite中 分贝 本地消息和所有服务器中的消息都没有引用 与特定用户相关的消息仅存储在其本地数据库中 我正在使用NSFetchResultController更新和刷新聊天记录 桌子当收到聊天记录时,它将被存储到数据库中,表格视图将加载新的聊天记录。 所有的核心数据操作都在主线程中完成 获取请求的batchsize为20,performfetch方法为 在viewDidLoad中调用 问题

收到聊天时,UI会挂起一段时间1- iPhone4中的2秒。如果我暂停执行,它表明 在fetch控制器的[tableview endUpdate]中是否发生了某些情况 代表 要在聊天视图中转到当前的最新聊天,用户必须 从数据库加载所有聊天记录 问题

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

我怎样才能以分页的方式加载聊天-比如什么sup或 viber-使用fetchresultcontroller

如果我对多个托管对象上下文使用后台模式,会有任何性能改进吗? 所有的核心数据操作都在主线程中完成

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

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


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

您需要在后台线程上执行CoreData操作。有很多这样做的例子,但我的建议是使用它,它使CoreData并发操作非常简单。

您需要在后台线程上执行CoreData操作。有很多这样做的例子,但我的建议是使用,它使CoreData并发操作非常容易

即使使用NSFetchedResultsController也非常好,它专为此类操作而设计。 批量大小有点像分页。看一看,第一个答案显示了如何使用限制和批量大小,如分页。 根据您的意思,更新/保存核心数据可以在后台线程中很好地处理,我建议这样做。抓取是另一回事,记住这一点。 最好把数据突变和数据提取看作两个独立的任务,这样你就可以在这两个任务上进行优化。我高度考虑阅读有关此事的更多信息:

CoreData专家Marcus Zarra向我展示了以下方法,该方法建立在上述父/子方法的基础上,但添加了一个专门用于写入磁盘的附加上下文。正如前面提到的,长写操作可能会在短时间内阻塞主线程,导致UI冻结。这种智能方法将写入分离到自己的私有队列中,并使UI像按钮一样平滑

即使使用NSFetchedResultsController也非常好,它专为此类操作而设计。 批量大小有点像分页。看一看,第一个答案显示了如何使用限制和批量大小,如分页。 根据您的意思,更新/保存核心数据可以在后台线程中很好地处理,我建议这样做。抓取是另一回事,记住这一点。 最好把数据突变和数据提取看作两个独立的任务,这样你就可以在这两个任务上进行优化。我高度考虑阅读有关此事的更多信息:

CoreData专家Marcus Zarra向我展示了以下方法,该方法建立在上述父/子方法的基础上,但添加了一个专门用于写入磁盘的附加上下文。正如前面提到的,长写操作可能会在短时间内阻塞主线程,导致UI冻结。这种智能方法将写入分离到自己的私有队列中,并使UI像按钮一样平滑

关于你的问题2

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

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

我对fetchresultcontroller不太在行,我会做一些研究并让您确定。

关于您的问题2

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

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


我不擅长fetchresultcontroller,我会做一些研究并让您确定。

学习核心数据本身将比使用第三方框架包装核心数据走得更远。甚至MagicalRecord的创建者也表示,最好先学习核心数据。创建子上下文和NSOperation子类不是一门高级学科,值得学习。不能与核心数据大师争论:非常正确。学习核心数据本身将比使用包装核心数据的第三方框架走得更远。甚至MagicalRecord的创建者也表示,最好先学习核心数据。创建子上下文和子类不是一门高级学科,值得学习。不能与核心数据大师争论:非常正确。我不太确定。插入一个新行然后获取它怎么可能需要1到2秒钟?这应该足够快,可以在主线程上完成,我认为还有其他事情要做。核心数据,特别是NSFetchedResultsController,不仅仅是插入和获取模型。它查询部分对象、监视更改、在需要模型属性值时触发故障、处理更改、保存到磁盘等。如果您在主线程上进行更新和保存,那么就不必要地阻止了假定为只读的NSFetchedResultsController。是的,我知道它可以做到这一切,但根据我的经验,它只发生在微秒,而不是秒。我确实在后台线程上使用了一个单独的上下文来处理速度较慢的事情,例如:在数据库中插入3000个新条目,但大多数时候我不需要麻烦。通常在主线程上进行更改的速度足够快。您的用例可能只是幸运而已。一旦处理复杂的关系或多个NSFetchResultController等,即使只有几百条记录也会引起明显的问题。我不太确定。插入一个新行然后获取它怎么可能需要1到2秒钟?这应该足够快,可以在主线程上完成,我认为还有其他事情要做。核心数据,特别是NSFetchedResultsController,不仅仅是插入和获取模型。它查询部分对象、监视更改、在需要模型属性值时触发故障、处理更改、保存到磁盘等。如果您在主线程上进行更新和保存,那么就不必要地阻止了假定为只读的NSFetchedResultsController。是的,我知道它可以做到这一切,但根据我的经验,它只发生在微秒,而不是秒。我确实在后台线程上使用了一个单独的上下文来处理速度较慢的事情,例如:在数据库中插入3000个新条目,但大多数时候我不需要麻烦。通常在主线程上进行更改的速度足够快。您的用例可能只是幸运而已。一旦处理复杂的关系或多个NSFetchResultController等,即使只有几百条记录也会引起明显的问题。