将Web服务数据缓存到核心数据的好方法是什么。主要目标是当设备在线或发生一些更新并且用户也能够离线获取数据时将Web服务数据同步到核心数据中。那么如何那件事将实施任何好的建议。
2 回答
我已经做到了。我的过程是使用网络客户端(在我的例子中是 AFNetworking),然后在成功请求后,我会执行以下操作:
从核心数据实体中删除所有对象
在 AppDelegate 中创建一个 NSOperationQueue 并使用一个自定义 Parser 类,该类实例化一个新的 ManagedObjectContext 以在后台线程上使用
解析来自 Web 服务的响应,并使用后台线程将对象插入回 CD 实体中
// Register context with the notification center
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc addObserver:self
selector:@selector(mergeChanges:)
name:NSManagedObjectContextDidSaveNotification
object:ctx];
然后当我保存托管对象时(我每五次保存一次),通知将被发送并且此方法将被触发:
- (void)mergeChanges:(NSNotification *)notification
{
id appDelegate = [[UIApplication sharedApplication] delegate];
NSManagedObjectContext *mainContext = [appDelegate managedObjectContext];
// Merge changes into the main context on the main thread
[mainContext performSelectorOnMainThread:@selector(mergeChangesFromContextDidSaveNotification:)
withObject:notification
waitUntilDone:NO];
}
这将主要在后台更新核心数据实体,然后在主线程中合并更改(每五个“记录”)。我为用户提供的初始 UI 是一个 TableView,它依赖于更新的核心数据实体,并且更新速度足够快,用户能够在新数据进入时使用 tableview(FetchedResultsController 将管理新数据的插入电视中的行)。
如果需要,我可以发送更多代码,但其要点是使用 NSOperationQueue 解析在后台线程上创建的托管对象,然后使用主线程的 MOC 每隔一段时间(在我的情况下为 5 条记录)将更改合并到上下文中.
试试 RestKit:http: //restkit.org/
RestKit 的主要目标是允许开发人员更多地考虑其应用程序的数据模型,而不必担心发送请求、解析响应和构建远程资源表示的细节。