2009-04-30 18 views
3

以下は、私のアプリケーションのメインスレッドとは別のスレッドで実行されるコードブロックです。各ボタンがサムネイルを取得した後、UIを更新するにはどうすればよいですか?現在、メソッド全体が終了するまで更新されません。ボタンはすでにUIScrollViewに追加されています。このスレッドの途中でUIを更新するにはどうすればよいですか?

(LotsGridButtonは、いくつかの余分な性質を持つだけUIButtonである。)

- (void)fetchThumbnails { 
    CCServer* server = [[CCServer alloc] init]; 
    for (int i=0; i<[buttons count]; i++) { 
     LotsGridButton* button = [buttons objectAtIndex:i];  
     if (button.lot.thumbnail) continue; 
     // load the thumbnail image from the server 
     button.lot.thumbnail = [server imageWithPath:button.lot.thumbnailURL]; 
     [button setImage:button.lot.thumbnail forState:UIControlStateNormal]; 
    } 
    [server release]; 
} 

答えて

5

performSelectorOnMainThread:方法を見てみましょう、例えば:

[myButton performSelectorOnMainThread:@selector(setThumbnail:) withObject:[server imageWithPath:myButton.lot.thumbnailURL] waitUntilDone:NO]; 
+0

甘いです!私はラッパーメソッドを作った(performSelectorは1つのargとsetImage:forState:2を取るため)これは「メインスレッドのウィジェットを変更するとすぐに変更が反映される」のような一般的なパターンのインスタンスですか? – lawrence

+0

iPhoneでは、少なくとも、UIの更新はメインスレッドで行われます。ウィジェットをバックグラウンドスレッドから確実に更新することはできません。したがって、UI更新を実行するメインスレッドでメソッドを実行すると、UIの更新を高速化する可能性が高くなります。 –

3

私はiPhoneとは経験をしたんが、ココアで、一般的に、あなただけのメインスレッドからUIを更新することになっています。 NSObjectののを使用して、あなたはメインスレッドでコードを実行することができ、別のスレッドから

setImage:forState:の代わりに

performSelectorOnMainThread:withObject:waitUntilDone: 
関連する問題