嘿,我正在这里为我们的应用程序设计模型层。
一些要求是这样的:
- 它应该可以在iPhone OS 3.0+上运行。
- 我们的数据源是一个RESTful Rails应用程序。
- 我们应该使用Core Data在本地缓存数据。
- 客户端代码(我们的UI控制器)应尽可能少地了解任何网络内容,并应使用Core Data API查询/更新模型。
我已经检查了有关构建服务器驱动的用户体验的WWDC10会议117,并花了一些时间检查了Objective Resource,Core Resource和RestfulCoreData框架。
Objective Resource框架不会自己与Core Data对话,而仅仅是REST客户端实现。Core Resource和RestfulCoreData都假定您在代码中与Core Data进行了对话,并且它们解决了模型层背景中的所有细节。
到目前为止,一切看起来还不错,尽管我最初虽然Core Resource或RestfulCoreData都可以满足上述所有要求,但是...有几件事似乎似乎都无法正确解决:
- 将本地更新保存到服务器时,不应阻止主线程。
- 如果保存操作失败,则错误应传播到UI,并且不应将任何更改保存到本地Core Data存储。
当您调用- (BOOL)save:(NSError **)error
托管对象上下文时,核心资源恰巧将所有请求发送给服务器,因此能够以某种方式向服务器提供基础请求的正确NSError实例失败。但是它将阻塞调用线程,直到保存操作完成。失败。
RestfulCoreData使您的-save:
调用保持完整,并且不会为客户端线程引入任何额外的等待时间。它仅注意NSManagedObjectContextDidSaveNotification
,然后在通知处理程序中向服务器发出相应的请求。但这种方式的-save:
呼叫总是成功完成(当然,考虑到核心数据是好的,与保存的更改)和客户端的代码,居然叫它没有办法知道节省,可能也没有传播到因为一些服务器404
或421
或任何发生服务器端错误。甚至更多,本地存储变得可以更新数据,但是服务器永远不知道这些更改。失败。
因此,我正在寻找解决所有这些问题的可能的解决方案/通用做法:
-save:
在网络请求发生时,我不希望调用线程在每次调用时都阻塞。- 我想以某种方式在用户界面中收到一些同步操作出错的通知。
- 如果服务器请求失败,我也希望实际的核心数据保存失败。
有任何想法吗?