将 Webservice 数据缓存到核心数据中

Posted

技术标签:

【中文标题】将 Webservice 数据缓存到核心数据中【英文标题】:Cache Webservice data into core data 【发布时间】:2012-04-26 07:46:24 【问题描述】:

将网络服务数据缓存到核心数据的好方法是什么。主要目标是当设备在线或发生一些更新并且用户也能够离线获取数据时将网络服务数据同步到核心数据中.那么这件事将如何实施任何好的建议。

【问题讨论】:

【参考方案1】:

我已经做到了。我的过程是使用网络客户端(在我的例子中是 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。

【讨论】:

【参考方案2】:

试试 RestKit:http://restkit.org/

RestKit 的主要目标是让开发者在 他们的应用程序的数据模型方面和担心更少 发送请求、解析响应和构建的详细信息 远程资源的表示。

【讨论】:

以上是关于将 Webservice 数据缓存到核心数据中的主要内容,如果未能解决你的问题,请参考以下文章

RestKit - 仅在第二次调用时将缓存保存到核心数据

将更改 NSManagedObject 保存到核心数据失败

缓冲预热缓冲降级等问题

如何在目标 c 中将核心数据对象同步到 Web 服务

核心数据还是 ASIHTTPRequest 缓存?

FT项目开发技术点