2010-12-08 29 views
3

私はのUITableViewの連絡先からサムネイル画像を表示するiPhoneアプリに取り組んでいます。私は、サムネイルをオンにするまでのUITableView - 遅延読み込みコンタクトイメージ

すべては、それがスクロールするのは非常に遅くなり、非常に高速です。 他のすべてのデータはコアデータによってバックアップされていますが、事前にコアデータにイメージを保存しようとしましたが、起動に時間がかかり、柔軟性が低くなります。

本当に必要なのは、ルックアップと準備のサムネイルを別のスレッドやNSOperationなどで遅延させることができますが、これを達成するための最も簡単な方法はわかりません。私はそれで苦労していますが、画像がウェブから来れば素晴らしいです

AppleのサンプルプロジェクトLazyTableImagesは、確実に、適合させることができます。基本的には問題は同じですが、ダウンロードやネットワークの待ち時間などのタイムラグではなく、ユーザーのアドレス帳の画像を検索するのに時間がかかります。

 UIImage *contactImage = nil; 
     if (ABPersonHasImageData(person)) { 

     NSData *contactImageData = (NSData*)ABPersonCopyImageData(person); 
     UIImage *tempContactImage = [UIImage imageWithData:contactImageData]; 
     [contactImageData release]; 

     UIGraphicsBeginImageContext(CGSizeMake(45.0f, 45.0f));    
     [tempContactImage drawInRect:CGRectMake(0.0f, 0.0f, 45.0f, 45.0f)];   
     contactImage = UIGraphicsGetImageFromCurrentImageContext(); 
     UIGraphicsEndImageContext(); 

     } 

シンプルかつエレガントな方法でこれを達成するために、任意の有用なヒントやコードを持っている人に大きな感謝:

これは私が同時に行う必要があり、私の表のセルのサブクラスで作業です。すでにUIImageを持っている場合は

答えて

1

、なぜあなたはcontactImageに描画するために必要なのですか? tempContactImageを直接使用することはできますか?

良いスタートは、単純にこれを行うには、次のようになります。

cell.imageView.image = tempContactImage 

EDIT:

方法について:それは(それがかもしれない)まだ途切れ途切れになら

ABPersonRef person = ...get person... 
UITableViewCell * cell = ...get cell... 
[ [ NSOperationQueue mainQueue ] addOperation: 
    [ NSBlockOperation blockOperationWithBlock:^{ 
     if (ABPersonHasImageData(person)) { 
     ... 
     } 
     cell.imageView.image = contactImage ; 

    } ] ; 

はあなたがキューイングすることができますあなたのバックグラウンドスレッドのテーブルビューに適用する必要があるイメージは、テーブルビューがスクロールを停止するまで待ってから、保留中のイメージ変更を適用します。

+0

あなたはcontactImageに描画されている場合だけ、45.0x45.0に合わせて拡張するあなたも、単にとやるcell.imageView.contentMode = UIViewContentModeScaleAspectFill – nielsbot

+0

ABPersonCopyImageData(人上記のコードを使用することができます); CFDataRef imageData = ABPersonCopyImageDataWithFormat(人物、kABPersonImageFormatThumbnail); –

+0

ありがとうございますが、あなたがちょうど使用している場合:ABPersonCopyImageData(人);あなたはそのサイズが何であれ、フルサイズのコンタクトイメージを取得します。これは実際に特定の形式の連絡先イメージを持つユーザーとのiPhoneアプリケーションでテーブルビューをクラッシュさせます。 今、私たちは新しいはるかに安全低くメモリ機能を使用する必要があります。 CFDataRef画像データ= ABPersonCopyImageDataWithFormat(人、kABPersonImageFormatThumbnailを)。 –

1

は、このメソッドを使用します。 kABPersonImageFormat * サムネイル *

(NSData*)ABPersonCopyImageDataWithFormat([targetPeople objectAtIndex:index], kABPersonImageFormatThumbnail) 
関連する問題