2012-01-05 11 views
8

Webサービスからオブジェクトのリストを返すAPIメソッドを作成しています。また、このサービスは結果をキャッシュし、キャッシュされた結果(存在する場合)を戻してからWebサービスに再度アクセスしようとします。だから私はこのリストをCore Dataエンティティに保存しています。しかしCore Dataは、順序を保持しないNSSetにto-mayリレーションシップを格納することしかできません。しかし、キャッシュされた結果に元の注文(元々はWebサービスのもの)を保持したい。私はその命令がどのように確立されているかを必ずしも分かっていないので(私はソートできません)。コアデータで順序付きリストを保持するにはどうすればいいですか

どうすればこの注文を保存できますか?私の計画は、オブジェクトIDを持つ文字列を格納することです。

NSString *objectIds = @"1 5 2 9 4"; 

これはこれを行う最良の方法ですか?

答えて

10

iOS 5をターゲットにできる場合は、任意の順序のコアデータ関係に新しいNSOrderedSet機能を使用できます。この新機能の詳細については、Core Data Release Notes for iOS 5を参照してください。

iOS 4をサポートする必要がある場合は、ご自分で注文を処理する必要があります。これを行う一般的な方法は、モデルに整数プロパティを追加し、次にこれを管理する必要があります。その後、データをフェッチするときにこのプロパティをソートできます。

完全に異なる文字列での注文の保存は間違った方法です。順序が重要な場合、この情報はモデル内になければならず、ユーザーはそれを直接問い合せることができます(「この特定のリストの最初の5つのオブジェクトを教えてください」または「オブジェクトfooのインデックスは何ですか?」)。オブジェクトIDの文字列を取得して解析した後、特定のオブジェクトIDのクエリが間違っていると感じます。

+1

実際には、それは多対多関係にのみ役立つと思います。 – 3lvis

+0

@SebastianCelisこれはすばらしい答えです。iOS Devを初めて学習している私のような人にとってはとても役に立ちました:)ありがとう。 – GangstaGraham

+0

NSOrderedSetは多くの関係でのみ利用可能であるとのコメントがありました。また、iOS 5のリリースノートはもう利用できません。 – Ixx

1

これは主観的な質問です。

1

オブジェクトを格納しているCoreDataモデルに独自のNSNumber IDフィールドを組み込むこともできます。 idは保存したい順序を表します。明らかにそれを自分で設定する必要があります。 CoreDataからオブジェクトをフェッチすると、そのIDでソートされます。後続のWebサービス呼び出しとアプリケーションの起動で、注文を正しく保持するために割り当てた最も高いid値のどこかを維持したい/保つ必要があるかもしれません。

+0

これはうまくいくでしょうが、単純な文字列よりもオーバーヘッドのようですが、Core Dataがどのように大きな文字列をどの程度うまく扱っているかわかりません。 – caleb

+0

オブジェクトidはあなたが背中の背後で変更しないことに頼ることができると信じている値ですが、他の場所でメンテナンスしている単調に増加するマスターインデックスから値が設定された独自のidフィールドを使用することは確かにきれいになります。私は完全に便利さと複雑さのバランスを取るという考えを得る。すでに各オブジェクトのデータメンバー(Webサービスから)を対応するCoreDataオブジェクトのデータメンバーにコピーしている場合は、IDに1つ以上のフィールドを追加するだけではそれほど多くのコードは作成されません。 –

+0

コアデータは、モジェネレータと組み合わせて使用​​する場合、NSOrderedSetを処理しません。したがって、このオプションは、より高価な(テストおよび学習する)方が効果的です。 – fatuhoku

関連する問題