ねえ、私はここで私たちのアプリのモデルレイヤーに取り組んでいます。
要件のいくつかは次のようなものです。
- iPhone OS3.0以降で動作するはずです。
- データのソースはRESTfulRailsアプリケーションです。
- CoreDataを使用してデータをローカルにキャッシュする必要があります。
- クライアントコード(UIコントローラー)は、ネットワークに関する知識をできるだけ少なくし、Core DataAPIを使用してモデルをクエリ/更新する必要があります。
私がチェックアウトしましたWWDC10セッション117をチェックアウトするいくつかの時間を費やしサーバー主導のユーザーエクスペリエンス、建物の上に目的のリソース、コアリソース、およびRestfulCoreDataの枠組みを。
Objective Resourceフレームワークは、それ自体ではCore Dataと通信せず、RESTクライアントの実装にすぎません。Core ResourceとRestfulCoreDataはすべて、コード内のCore Dataと通信することを前提としており、モデルレイヤーのバックグラウンドですべての要点を解決します。
これまでのところすべて問題ないように見えますが、最初はCore ResourceまたはRestfulCoreDataのいずれかで上記の要件がすべてカバーされますが、...正しく解決されていないように見えることがいくつかあります。
- ローカル更新をサーバーに保存している間は、メインスレッドをブロックしないでください。
- 保存操作が失敗した場合、エラーはUIに伝播され、変更はローカルCoreDataストレージに保存されません。
コアリソースは- (BOOL)save:(NSError **)error
、マネージドオブジェクトコンテキストを呼び出すと、サーバーにすべてのリクエストを発行するため、サーバーへの基になるリクエストの正しいNSErrorインスタンスを提供できます。ただし、保存操作が終了するまで、呼び出し元のスレッドをブロックします。不合格。
RestfulCoreDataは-save:
呼び出しをそのまま維持し、クライアントスレッドに追加の待機時間を導入しません。を監視しNSManagedObjectContextDidSaveNotification
、通知ハンドラーでサーバーに対応する要求を発行するだけです。しかし、この方法-save:
呼び出しは常に(コアデータが保存された変更で大丈夫です与え、ウェル)正常に完了し、実際にそれがあるため、いくつかのサーバーに伝播しなかったかもしれない保存知る方法がありませんと呼ばれるクライアントコード404
またはを421
または何をサーバー側のエラーが発生しました。さらに、ローカルストレージはデータを更新するようになりますが、サーバーは変更を認識しません。不合格。
だから、私はこれらすべての問題に対処するための可能な解決策/一般的な慣行を探しています:
- 呼び出し元のスレッドがそれぞれをブロックしたくない
-save:
ネットワーク要求が発生している間、呼び出しでない。 - 同期操作が失敗したという通知をUIで取得したいのですが。
- サーバー要求が失敗した場合、実際のCoreDataの保存も失敗するようにします。
何か案は?