1

背景情報:

ローカル ギャラリーとサーバー ギャラリーの 2 つのギャラリーを含む iOS アプリケーションをプログラムします。ユーザーがサーバー ギャラリーを更新してローカル ギャラリーにマージすると、アプリは新しい画像のみをダウンロードする必要があります。

メモリ消費を最小限に抑えるために、画像を保存し、ImageEntity次の属性を持つクラスのインスタンスで配列を埋めます: fileNamefilePath & VotingStatus

次のロジックを使用して、イメージが既に存在するかどうかを確認しようとしました。

for (ImageEntity *imageEntity in self.serverImagesArray) {
  if (![self.localImagesArray containsObject:imageEntity]){
    [self.localImagesArray  addObject:imageEntity];
  }
}

ただし、各エンティティは個別のオブジェクトであるため、常に追加されます。ただし、各エンティティには一意のfileNameがあります。


質問:関数を 拡張して[NSArray containsObject:]、配列内の 1 つのオブジェクトに「someValue」と等しい属性があるかどうかを確認することはできますか? (Cocoa-Bindings を ArrayController と組み合わせて使用​​すると、配列要素の属性を割り当てることができます。これと同様の属性にアクセスしたいと思います)。


ローカル配列の各エンティティをサーバー配列の各要素と比較できることを知っていますただし、 O(n^2) 回の比較を行う必要があり、ギャラリーには数百の画像が含まれる場合があります。

おまけの質問:気づかないうちにすでにこれを行っていますか? Apple によるこの機能の実装について詳細を知っている人はいますか? ファンシーな実装がありますか、それともすべての要素を比較する配列を反復処理しているだけですか?

4

2 に答える 2

6

valueForKey:と組み合わせて使うのが私のやり方ですcontainsObject:。したがって、あなたの場合、配列のすべてのファイル名を収集してから、必要な特定のファイル名が配列に含まれているかどうかを確認する必要があります。

NSArray * fileNames = [fileEntityObjects valueForKey:@"fileName"];
BOOL contains = [fileNames containsObject:@"someFilename.jpg"];

これは、配列fileName内のすべてのオブジェクトのプロパティである場合に機能します。fileEntityObjects

アップデート

NSPredicateはい、同様にこれを行うことができます:

NSPredicate * predicate = [NSPredicate predicateWithFormat:@"SELF.fileName = %@", "someFileName.jpg"];
NSArray * filteredArray = [fileEntityObjects filteredArrayUsingPredicate:predicate];

ただし、ブール値の代わりに、そのファイル名を持つオブジェクトの配列を取得することに注意してください。

于 2013-03-11T11:49:48.920 に答える
1

この質問には「パフォーマンス」というタグが付けられているため、別の回答を追加します。

n^2 の比較を回避するには、既に存在する画像をより高速に検出する方法を見つける必要があります。これを行うには、ルックアップを非常に迅速に実行できるセットを使用します。

NSMutableSet *localFileNames = [NSMutableSet set];
for (ImageEntity *imageEntity in self.localImagesArray)
    [localFileNames addObject:imageEntity.fileName];

次に、前と同じようにサーバー イメージを反復処理します。前のcontainsObject:ものは、高速セット検索に置き換えられます。

for (ImageEntity *imageEntity in self.serverImagesArray) {
    if ([localFileNames member:imageEntity.fileName] == nil)
        [self.localImagesArray addObject:imageEntity];
}
于 2013-03-11T13:44:52.020 に答える