2013-07-26 16 views
5

私はiOSアプリケーションにオフライン同期機能を構築しようとしており、同じことをするための戦略とベストプラクティスについてコミュニティからフィードバック/アドバイスを受けたいと考えています。アプリの詳細は次のとおりです:iOS Appオフラインと同期

このアプリはユーザーにデジタルカタログを表示し、注文の作成や注文などの操作を実行できます。 現在のところ、このアプリはオンラインでのみ動作し、カタログの表示、JSONデータを返す注文の作成/配置などのすべての操作のAPIが用意されています。 オフライン/シンクロナイゼーション機能をユーザーに提供したいと考えています。ユーザーは、カタログを表示したり、オフラインで注文を作成したりできます。オンラインになると、注文の詳細が同期され、サーバーに更新されます。 また、サーバーから最新のデータを取得し、カタログの変更や、アプリケーションがオフラインの間にサーバーで発生した変更を注文した場合に、アプリケーションを最新の状態に保ちたいと考えています。 この種の機能を処理するための最良の設計とアプローチを手伝ってもらえますか?

答えて

6

私は今年初めに同様のことをしました。 NSOperationQueue and NSOperationについて読むと、私はまっすぐ前向きなアプローチをしました:

ローカルデータベースでオブジェクトが変更/追加/ ...されるたびに、新しい「同期」操作をキューに追加しても気にしませんアプリがオンラインかオフラインか(キューを一時停止するか、それを元に戻す可到達性オブザーバを追加したのはもちろん、エラーが発生した場合は再キューイングします)。操作自体は、データベースを読み書きし、ネットワーキングの処理を行います。私のViewControllerは、NSFetchedResultsController(delegate = selfを使用)を使用して、変更のコールバックを取得します。場合によっては、NSManagedObjectContextObjectsDidChangeNotificationを使用した余分なローカルデータが必要でした(オブジェクトのカウントについてです)。

さらに、私はMulti-Context CoreDataを使用しましたが、これはかなり妥当であり(2つのコンテキストしかありません)

あなたのサーバーからの変更を通知するには、iOS 7に新しいものがあると思います。

i.e. Data Synchronization by Dan GroverまたはDeveloping Android REST Client Applications(もちろん、そこにはさらに多くの優れた記事があります)のサーバー側では、実際のアプローチについて少しお読みください。

1

注意:簡単な解決策を期待すると、あなたは失望することがあります。お客様の要件は珍しいことではありませんが、ソリューション ""は、 "ビジネスルール"やその他の合理的な要件によって、予想以上に複雑になる可能性があります。要件をインテリジェントに制限する場合は、自分で実装できる解決策があります。そうでない場合は、市販の製品を使用することも考えられます。

私は、ビジネスロジックを設計してオフライン状態を考慮し、明示的にビジネスロジックに公開すると想像することができますが、あなたは中程度の労力で自分で実装できる解決策を見つけることができます。つまり、ユーザーが注文を作成すると、最初は「コミットされていません」と表示されます。注文は、サーバーへのアクセスがある場合にのみコミットされ、サーバーがこのユーザーが実際にこの注文を出すことができる「OK」を出した場合にのみコミットされます。サーバは、注文を拒否し、対応するメッセージをユーザに送信することもできる。

eventual consistencyの要件のために発生する可能性がある微妙な問題が多分あります。

questionも参照してください。商用製品のソリューションへのポインタが含まれています。ウェブサイトにアクセスした場合、問題の複雑さとその解決方法に関する貴重な情報が得られます。

関連する問題