2011-09-09 12 views
1

私はNSMutableDictionaryにプロファイル画像を格納する画像キャッシュクラスを持っています。キーが存在する場合、キャッシュはUIImageオブジェクトを返し、そうでない場合はダウンロードし、辞書に格納してUIImageを返します。この共有キャッシュは、このようNSThreadedメソッドの内部で呼び出されます。UITableViewCell用スレッドの画像キャッシュ

[NSThread detachNewThreadSelector:@selector(setImageForUser:) toTarget:self withObject:imageUrlString]; 

-(void)setImageForUser:(NSString *)imageUrlString { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    LPImageCacher *imageCache = [LPImageCacher sharedCache]; 
    UIImage *profileImg = [imageCache getCachedImageFromMemory:imageUrlString]; 
    self.userProfileImageView.image = profileImg; 
    if (profileImg == nil) { 
     imageUrlString = [[myGlobals sharedInstance].avatarUrlDefault stringByAppendingString:@"/avatar.png"]; 
     self.userProfileImageView.image = [imageCache getCachedImageFromMemory:imageUrlString]; 
    } 

    [pool release]; 
} 

問題で何がロードされる前に、彼らはのUITableViewをスクロールした場合、画像はバックログを取得して、最終的にすべてのイメージがロードされ、それらが点滅していることと変更それが正しいものになるまで、現在のセルに私は、各セルにNSThreadのインスタンスを作成し、-prepareForReuseのスレッドをキャンセルするのは良いと思っていましたが、NSThreadオブジェクトを再利用することはできません。

答えて

1

あなたが見ている問題は、スクロールしているときはいつでもUIScrollViewがすべてを「フリーズ」することによるものだと思います。これは実行ループの問題です。この問題を回避するには、デフォルトの実行ループで-setImageForUser:メッセージを送信していることを確認する必要があります。

チェック詳細については、これらのリソース:このことができます

NSURLRequest won't fire while UIScrollView is scrolling

UIScrollView pauses NSTimer until scrolling finishes

願っています!

0

リードオルセンがあなたに直接答えをくれました。私は別のことを言いたい。

各セルのスレッドのディスパッチはかなりコストがかかりますが、なぜNSOperationQueueを使用しないのですか?個々の負荷を実行するワーカースレッドのセットを持つことができます。このキューは、常に表示可能なセルの最大量に制限されています。これはかなり "再利用スレッド"です。

実際、ASIHTTPのASINetworkQueueを使用することをお勧めします。 NSOperationQueueよりも使用する方が簡単です。

また、スクロール速度が一定数を下回ると、セルをロードするための単純な最適化を追加してください。なぜあなたはそれらを見るのをやめることができなくなるでしょうか?例えば、私はのtableViewのためにこのようなものを書いた:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
    static float prevOffset = 0.0; 
    static float scrollSpeed = 0.0; 

    // positive -> downwards 
    scrollSpeed = scrollView.contentOffset.y - prevOffset; 

    if (scrollSpeed < 2.0) 
    { 
     [self loadImagesForVisibleCellsInTableView:(UITableView*)scrollView]; 
    } 
    else if (scrollSpeed < 6.0) 
    { 
     shouldLoadImages = YES; 
    } 
    else 
    { 
     shouldLoadImages = NO; 
    } 

    prevOffset = scrollView.contentOffset.y; 
} 

これはのtableViewは、高速移動しているとき(shouldLoadImagesがロード画像を無視するように言って、tableView:cellForRowAtIndexPathに影響します)、それが停止する程度だとき、それは、新しいイメージをロード無視します目に見える細胞を再ロードするように強制する。

関連する問題