核心数据客户端+服务器/后台保存/一般导入问题

时间:2010-06-26 14:27:42

标签: iphone objective-c core-data ios

我正在开发基于Core Data的应用程序,该应用程序的Mac应用程序充当“服务器”,而iPhone则充当客户端。除了我遇到性能问题外,一切都在游动。

当用户点击一个对象时,服务器必须返回一些与该对象相关的对象(没有太重,通常是3-4个对象),并显示一个用户界面来选择一些选项。这需要尽可能快。服务器的往返时间,服务器提取数据,格式化,返回客户端,以及客户端从数据创建NSManagedObjects(无法进一步优化)约为200毫秒。与呈现UI(不能再进一步优化)相关的代码需要大约150ms。在运行iOS 4.0的iPod touch 2G上,导入对象后保存托管对象上下文的单行代码占用150-200毫秒。

对我而言,这尖叫我应该为托管对象上下文保存做背景。但是,据我了解,这并不能真正满足我的需求。如果我想在后台线程上保存托管对象上下文,那么其中的所有对象必须是在单独的托管对象上下文中的后台线程上创建的,所以我不会看到任何速度增益,因为它仍然需要100保存发生的时间是200毫秒,我将看到更多的开销,因为在我的视图控制器看到它需要之前,我仍然需要告诉我的主线程从后台管理对象上下文保存更新它的托管对象刷新自己。

我错过了一个明显的解决方案吗?在这种情况下我可以使用的核心数据有什么帮助吗?我讨厌在这里抛出这样一个普遍的问题,但是我完全不知道从哪里开始。

1 个答案:

答案 0 :(得分:2)

听起来您需要将整个服务器通信移动到后台线程。如果你这样做,那么无论与服务器的通信花了多长时间,整个UI都会响应。

为此,您在连接到同一NSManagedObjectContext的后台线程上站起来第二个NSPersistentStoreCoordinator。然后在该后台线程上执行服务器通信(甚至可以使用NSOperation)并保存更改。

您的主线程因此主NSManagedObjectContext侦听保存通知,当它收到保存通知时,它会更新主线程和UI。这将消除您所看到的任何冻结,处理时间变得无关紧要。