2009-07-17 3 views
8

外部データソースを使用するiPhone用のCore Dataアプリケーションを作成しようとしています。私は実際にオブジェクトを保持するためにCore Dataを使用するのではなく、オブジェクトライフサイクル管理のために使用しています。ローカルデータにCore Dataを使用する方法についてはかなり良い考えがありますが、リモートデータに関してはいくつかの問題があります。私は例としてFlickrのAPIを使用します。Core Dataでリモートデータにアクセスするためのパターン?

まず、最近の写真のリストを言う必要がある場合は、外部のデータソースから取得する必要があります。リストを取得した後、各写真の管理オブジェクトを繰り返して作成する必要があるようです。この時点で、私は自分のコードで作業を続け、標準的なCore Data APIを使ってフェッチリクエストを設定し、例えば犬についての写真のサブセットを取得することができます。

しかし、ユーザーの写真のリストを引き続き検索したい場合はどうすればいいですか?これらの2つのデータセットが交差する可能性があるため、既存のデータに対してフェッチ要求を実行し、既に存在するものを更新してから新しいオブジェクトを挿入する必要がありますか?

- 古いパターンでは

、私は単純にこれらのデータセットごとに別々のデータ構造を持っており、それらを適切にアクセスします。 recentPhotosセットとusersPhotosセット。しかし、Core Dataの一般的なパターンは1つの管理対象オブジェクトのコンテキストを使用するように思われるので、データをメインプールにマージする必要があるようです(間違っている可能性があります)。しかし、それは写真のリストを取得するだけのオーバーヘッドのように思えます。異なるセットの管理対象オブジェクトコンテキストを個別に作成する必要がありますか?コアデータをここでも使用する必要がありますか?

Core Dataについて魅力的だと思うのは、(Webサービスの)以前は、特定のデータをリクエストしてリクエストでフィルタリングしたり、コードでフィルタリングしたり、 。コアデータでは、オブジェクトのリストを取得してプールに追加し(必要に応じて古いオブジェクトを更新する)、それに対してクエリを実行できます。しかし、このアプローチでは、オブジェクトを外部から削除すると、古いデータを保持しているので、わかりません。

ここでベースオフですか?リモートデータとコアデータを処理するためのパターンがありますか? :)私は彼らがそれをやったと言っている人々のいくつかの記事を見つけた、それは彼らのために働くが、例の方法ではほとんどありません。ありがとう。

+0

あなたはもっと具体的にお答えできますか? '外部データソースを使用する'は非常に曖昧です。外部データベースの一部をローカルでミラーリングするように思えます。宣伝されたローカル変更を行う必要がありますか?紛争はどうですか?これは難しい問題であり、詳細がわかると指示が示唆されます。 –

+0

おそらく古くなったスレッド、私はバックグラウンドスレッドで物事を取得し、それらを永続的なストアに書き込もうとしていて、そこからメインスレッドに通知が波及するように誘惑されるでしょう。それが実現すれば – bshirley

答えて

0

このような状況では、Cocoaのアーカイブ機能を使用して、写真オブジェクト(およびインデックス)をセッション間でディスクに保存し、Flickrにホームを呼び出すたびに上書きすることができます。

コアデータを既に使用しているため、提供される機能と同様に、データモデルを変更して「ソース」属性や「コールタイプ」属性を追加しないでください。現時点では、ソース「Flickr API」を使って暗黙のうちにたくさんのオブジェクトを作成していますが、異なるAPI呼び出しを一意のソースとして扱い、明示的に保存することもできます。

削除を処理するには、データストアをリフレッシュするたびにデータストアをクリアするのが最も簡単な方法です。それ以外の場合は、すべてを繰り返し処理し、新しい結果に含まれていないファイル名の写真オブジェクトのみを削除する必要があります。

私はこれに似た何かをするつもりですので、これが役立つことを願っています。

PS:セッション間に写真オブジェクトを保存しない場合は、2つの異なるコンテキストを使用して別々に照会できます。彼らが決して救われない限り、中央の店はそれに何も持っていません、あなたが描写するのと同じように動作します。

2

あなたの最初の本能が正しいと思います。fetchrequestsを使用して既存のストアを更新する必要があります。私が輸入業者に使用したアプローチは次のとおりでした:輸入に適格なすべてのファイルのリストを入手し、どこかに保管してください。私は、このリストを取得するのが速く軽量(名前とURLまたは一意のID)だと仮定していますが、実際に何かをインポートするにはもう少し時間と労力がかかるでしょう。ユーザーはプログラムを終了するか、それ以外の場合は、すべてのインポートが完了します。

次に、NSRunLoopとNSTimerのおかげで「コアデータ:効率的にデータを読み込む」のおかげで難しいことではありません)、そのリストの最初の項目を取得し、オブジェクトを取得しますFlickr、またはCore Dataデータベースで検索してください(効率的なキャッシュされたNSFetchRequestの設定については、AppleのPredicate Programming Guideを熟読してください)。リモートオブジェクトがすでにコアデータに存在する場合は、挿入しない場合は必要に応じて情報を更新します。それが完了したら、インポートするリストから項目を削除し、次の項目に移動します。

リモートストアで削除されたオブジェクトの問題には、定期的な同期または遅延したオンデマンド同期の2つのソリューションがあります。 Flickrからの写真の読み込みは、オリジナルのものとそのメタデータ(私の所有権に関するポリシーは何か分かりません)の読み込みを意味するのでしょうか、サムネイルといくつかの情報をインポートしたいだけですか? ローカルにすべてを保存する場合は、ローカルストアのすべてがリモートに存在するかどうかを確認するために数日または数週間ごとにチェックを実行するだけです。そうでない場合、ユーザーは写真をとどまるか削除するかを決定できます。 サムネイルまたはプレビューのみを保存する場合は、ユーザーがフル画像を表示するたびにFlickrに接続する必要があります。削除されている場合は、ユーザーに通知してローカルで削除するか、それ以上アクセスできないとマークすることができます。

2

2つのことを組み合わせて試してみることもできます。この戦略では、NSFetchRequestの結果を2回取得します.1回は同期、もう一度はデータがネットワークからロードされます。

  1. フェッチが終了したときに実行 に追加のブロック性を取る NSFetchRequestの独自のサブクラスを作成します。 これは、ネットワークへの非同期の要求です( )。 FLRFetchRequest

  2. このリクエストを に渡すクラスを作成します。それを FLRPhotoManagerとしましょう。 FLRPhotoManagerはフェッチ要求に基づいてFLRFetchRequestとの インスタンスを取る方法executeFetchRequest: ...

    1. キューネットワークの要求があり、ネットワーク要求があるとき再びを処理するフェッチ保持の要求に沿って通過します終了しました。
    2. CoreDataキャッシュに対してフェッチ要求を実行し、すぐに結果を返します。
    3. ネットワーク要求が完了したら、コアデータキャッシュをネットワークデータで更新し、再度キャッシュに対してフェッチ要求を実行し、今度はFLRFetchRequestからブロックを取り出し、このフェッチ要求の結果をブロックに渡します第2段階を完了する。

これは、私が出ている最高のパターンですが、あなたのように、私は相手の意見に興味があります。

+0

私はまたsimmilarアプローチを思い付いた - あなたは今これを行うより良い方法を見つけたのだろうか? – Petar

関連する問題