iphone – 如何同步CoreData和REST Web服务异步,同时适当地传播任何REST错误到UI

嘿,我在这里为我们的应用程序的模型层工作。

一些要求是这样的:

>它应该在iPhone OS 3.0上工作。
>我们的数据源是一个RESTful Rails应用程序。
>我们应该使用Core Data在本地缓存数据。
>客户端代码(我们的UI控制器)应该尽可能了解任何网络内容,并且应该使用Core Data API查询/更新模型。

我已经查看了关于构建服务器驱动的用户体验的WWDC10会话117,花了一些时间检查了Objective ResourceCore ResourceRestfulCoreData框架。

目标资源框架不会自己与Core Data交谈,而只是一个REST客户端实现。 Core Resource和RestfulCoreData都假设您在代码中与Core Data交谈,他们解决了模型层背景中的所有螺母和螺栓。

所有看起来还不错,最初我虽然Core Resource或RestfulCoreData将覆盖所有上述要求,但…有几件事情,他们似乎没有正确地解决正确:

>保存服务器的本地更新时,不应阻止主线程。
>如果保存操作失败,则错误应传播到UI,并且不应将更改保存到本地Core Data存储。

当您在托管对象上下文中调用 – (BOOL)save:(NSError **)错误时,Core Resource会向服务器发出其所有请求,因此能够向服务器提供底层请求的正确NSError实例失败不知何故。但它阻塞调用线程,直到保存操作完成。失败。

RestfulCoreData保持您的-save:调用完整,并且不会为客户端线程引入任何额外的等待时间。它只是监视NSManagedObjectContextDidSaveNotification,然后在通知处理程序中向服务器发出相应的请求。但是这样-save:调用总是成功完成(好吧,给定的核心数据可以保存更改),而实际调用它的客户端代码没有办法知道保存可能未能传播到服务器,因为一些404或421或发生的任何服务器端错误。甚至更多,本地存储变得更新数据,但服务器从不知道更改。失败。

所以,我正在寻找一个可能的解决方案/常见做法来处理所有这些问题:

>我不希望调用线程阻塞每个-save:在网络请求发生时调用。
>我想以某种方式在UI中收到一些同步操作出错的通知。
>如果服务器请求失败,我想要实际的Core Data保存失败。

有任何想法吗?

你应该真的看看RestKit(http://restkit.org)这个用例。它旨在解决将远程JSON资源建模和同步到本地Core Data支持的缓存的问题。它支持离线模式,当没有网络可用时,完全从缓存工作。所有同步发生在后台线程(网络访问,有效负载解析和管理对象上下文合并),并且有一组丰富的委托方法,所以你可以知道发生了什么。
http://stackoverflow.com/questions/3077444/how-to-sync-coredata-and-a-rest-web-service-asynchronously-and-the-same-time-pro

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:iphone – 如何同步CoreData和REST Web服务异步,同时适当地传播任何REST错误到UI