質問

Web API から電子メール アドレスなどのデータを取得する iPhone アプリを作成しています。各電子メール アドレスに関連付けられた画像を表のセルに表示したいので、アドレス帳で画像を検索し、電子メール アドレスがブックにない場合はデフォルトを使用します。これはうまく機能しますが、いくつかの懸念があります。

  • パフォーマンス:電子メール アドレス (または電話番号) でアドレス帳の記録を検索するために私が見つけたレシピは、次のとおりであると報告されています。 かなり遅い. 。その理由は、すべてのアドレス帳レコードを反復処理し、画像が含まれるレコードごとにすべての電子メール アドレスを反復処理して一致するものを見つける必要があるためです。もちろん、大規模なアドレス帳の場合、これには時間がかかる可能性があります。

  • 表のセル:そこで、画像を検索する必要があるメールアドレスをすべて集めて、一度に検索してみようと思いました。このようにして、すべてのアドレスに対して 1 回だけブックを反復処理します。ただし、これは、各セルが 1 つの電子メール アドレスに対応する表のセルではうまく機能しません。セルを表示する前にすべての画像を収集するか(遅い可能性があります)、読み込むときに各セルで各画像を検索する必要があります(一致するものを見つけるために本を反復処理する必要があるため、さらに遅くなります)。 各メールアドレス).

  • 非同期ルックアップ:そこで、次を使用して、それらを一括して非同期的に検索しようと考えました。 NSInvocationOperation. 。AddressBook で見つかった画像ごとに、アプリのサンドボックスにサムネイルを保存します。次に、各セルはこのファイルを参照し、ファイルが存在しない場合はデフォルトを表示します (ブックに含まれていない、またはまだ見つかっていないため)。後で非同期検索で画像が見つかった場合、次回その画像を表示する必要があるときに、その画像が突然表示されます。これは、画像を定期的に再生成する場合 (たとえば、アドレス帳内の画像が変更された場合など) にうまく機能する可能性があります。ただし、アプリの特定のインスタンスでは、しばらく画像が実際に表示されない可能性があります。

  • 非同期テーブルセルルックアップ:理想的には、次のようなものを使用します markjnetの非同期テーブルセル更新 ダウンロードした画像で表のセルを更新します。しかし、これが機能するには、 NSInvocationOperation 表示されている各セルのジョブ、およびキャッシュされたアイコンがサンドボックスに見つからない場合。しかし、その後は、それぞれのアドレス帳全体を非効率的に反復処理する作業に戻ります。新しい電子メール アドレスを大量にダウンロードしたばかりの場合は、その数が膨大になる可能性があります。

そこで私の質問は次のとおりです。他の人はどうやってこれをやっているのでしょうか?Tweetie2 をいじってみたところ、表示されている表のセルを非同期で更新するようです。必要な画像ごとに個別の HTTP リクエストを送信していると思います。もしそうなら、電子メール アドレスでローカル アドレス帳を検索する方が効率は悪くないと思います。それが最善の方法なのではないでしょうか?アドレス帳の検索に関連するパフォーマンスの問題について心配する必要はありませんか?

もしそうなら、サムネイル画像をサンドボックスに保存することがキャッシュへの最良の方法でしょうか?そして、アドレス帳の変更に応じてすべてのサムネイルを、たとえば 1 日に 1 回更新する新しいジョブを作成したい場合、最適な方法は何でしょうか?

残りの人はこの種の問題をどのように解決しますか?ご提案をお待ちしております。

役に立ちましたか?

解決

にかかわらず、あなたは画像の実際のキャッシュに使用するものな戦略の、私は唯一のアドレス帳のデータを一回通過可能な場合は、電子メールアドレスのバッチを取得するたびになるだろう。 (そして、はい、私は非同期的にこれを行うだろう。)

の検索結果を得るために、あなたのインメモリキャッシュとして機能するNSMutableDictionaryを作成します。 (例えば[NSNull null]など)そのキーの値としてセンチネルで、キーとしてダウンロードから各電子メールアドレスを使用してこの辞書を初期化します。

次に、ABRecordCopyValue(record, kABPersonEmailProperty)を呼び出し、返された各ABMultiValueで結果をループし、アドレス帳に各ABRecordRefを反復します。電子メールアドレスのいずれかがあなたのキャッシュ内のキーがある場合は、あなたの辞書にそのキーの値として[NSNumber numberWithInt:ABRecordGetRecordId(record)]を設定します。

ルックアップインデックスとしてこの辞書を使用して、あなたはすぐにあなたが現在hoopjonesの答えで提案されているように、ユーザーの現在のスクロール位置与えられたあなたのテーブルビューに表示しているだけメールアドレスをABRecordRefsの画像を得ることができます。あなたは、あなたのキャッシュを無効に別のインデックス操作をトリガし、その後、アプリケーションは、「最新ネス」のそのレベルを必要とする場合、ビューを更新するために、アドレス帳の変更リスナーを追加することができます。

他のヒント

私はあなたが記載されている最後のメソッド(非同期表のセルを参照)を使用するだけで表示されている現在のレコードのために画像を見てね。私は、ユーザーがスクロールを停止したときを知るためにUIScrollViewDelegateメソッドをオーバーロードした後にのみ、現在の可視セルの要求を作り始めます。

このような何か(私は今見つけることができません、これは少し私はウェブ上で発見のチュートリアルから変更され、作者を引用していないために謝罪):

- (void)loadContentForVisibleCells
{
    NSArray *cells = [self.table visibleCells];
    [cells retain];
    for (int i = 0; i < [cells count]; i++) 
    { 
        // Go through each cell in the array and call its loadContent method if it responds to it.
        AddressRecordTableCell *addressTableCell = (AddressRecordTableCell *)[[cells objectAtIndex: i] retain];
        [addressTableCell loadImage];
        [addressTableCell release];
        addressTableCell = nil;
    }
    [cells release];
}


- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView; 
{
    // Method is called when the decelerating comes to a stop.
    // Pass visible cells to the cell loading function. If possible change 
    // scrollView to a pointer to your table cell to avoid compiler warnings
    [self loadContentForVisibleCells]; 
}


- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate;
{
    if (!decelerate) 
    {
       [self loadContentForVisibleCells]; 
    }
}
あなたはレコードが現在表示されているどのようなアドレスを知ったら、

、ちょうどそれらの(おそらく5 -7たレコード)の検索を行うと、超高速になります。あなたがイメージをつかむたら、後で画像の要求をやり直す必要がないように、単に辞書でそれをキャッシュします。

あなたはのUITableViewにロード怠惰な画像を実現しようとしているようです。 アップルからの良い例があります、私はここでそれを参照しています: の中href="https://stackoverflow.com/questions/1130089/lazy-load-images-in-uitableview/1829035#1829035">レイジーロード画像

ちなみに、私は非同期画像の読み込みと高速ファイルキャッシングを行うための、無料の強力で、使いやすいライブラリをリリースしました:HJは、オブジェクトを管理しました http://www.markj.net/asynchronous-loading-caching-画像-iphone-hjobjman /

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top