2011-07-26 3 views
1

再描画:どのような糸でloadDidLoadコントローラの呼び出し方法では、UIViewの

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(loadImages) object:nil]; 
    [self.operationQueue addOperation:operation]; 
    [operation release]; 
} 

画像をダウンロードloadImages方法を、それを示しています

仕事
- (void) loadImages { 

    @synchronized (self) { 
     // download image... 
     // ... 
     // and next: 
     UIImageView *imageView = [imageViews objectAtIndex:currentImageIndex]; 
     [imageView performSelectorOnMainThread:@selector(setNeedsDisplay) withObject:nil waitUntilDone:YES]; 
     [imageView performSelectorOnMainThread:@selector(setImage:) withObject:[UIImage imageWithData:imageData] waitUntilDone:YES]; 
    } 
     //... 
} 

ショービュー初めてならば、次回のI画像を表示するにはiphoneを回転させる必要があります。 なぜ表示が再描画されないのですか?


私はアドバイスに従って、このコードを試してみました:

// imageButton is a UIView with button, image and label 
NSData *imageData = [[HttpClient sharedInstance] getResourceWithCache:thumbPath]; 
[imageButton performSelectorOnMainThread:@selector(setImage:) withObject:[UIImage imageWithData:imageData] waitUntilDone:YES]; 
[imageButton performSelectorOnMainThread:@selector(setNeedsDisplay) withObject:nil waitUntilDone:YES]; 
[imageButton drawRect:imageButton.frame]; 

が、動作しません。

+0

最初に画像を設定してからsetNeedsDisplayを実行するとどうなりますか? – yinkou

+0

他に何を同期させていますか?これは、特にダウンロードのような長い操作では、非常に危険です。デバッガを使用する - ブレークポイントをアタッチして2回目または3回目の実行時に有効にし、* whole * loadImagesコードをチェックします。 – Eiko

+0

今私はコールセレクタの順番を変えたら何が起きているのか確認できません。それはうまくいかないと思いますが、試してみます。誰かがビューコードに画像を設定した後に、スレッドからビューとサブビューを再描画する方法のサンプルコードを表示すると感謝しています。 –

答えて

4

あなたの問題は、ライン

 
     [imageView performSelectorOnMainThread:@selector(setNeedsDisplay) withObject:nil waitUntilDone:YES]; 

あなたが自己にself.viewにしていないsetNeedsDisplayを呼び出す必要があるでしょうです。

これは、setNeedsDisplayがdrawRectを呼び出す必要があるため、ビューをサブクラス化してブレークポイントをdrawRect:に入れてチェックします。

+0

drawRect:メインスレッドでコールする必要がありますか? –

0

私はloadDidLoadがタイプミスであり、あなたがviewDidLoadを意味していたと仮定しています。

viewDidLoadメソッドは、ビューコントローラの読み込みが完了したときに呼び出されます。これは、アプリケーションがメモリ警告を受け取り、ビューコントローラがアンロードされない限り、一度だけ行います。

ビューコントローラを保持していて、後で同じビューコントローラオブジェクトを再度表示している場合は、viewDidLoadメソッドが再び呼び出されることはありません。

ビューコントローラがビュースタックにプッシュされるたびにアクションを実行する必要がある場合は、viewWillAppear:またはviewDidAppear:を使用できます。 UIViewのといないのUIViewControllerのための方法をthatsのよう

+0

viewDidLoadとスレッドが実行されますが、iphoneを回転するまでビューは再描画されません。アドバイスによると、私はviewWillAppearからloadImagesを呼び出そうとしましたが、同じ動作です。長い時間が経過した後、またはiphoneを回転した後に再描画されます –

+0

イメージをダウンロードするのに時間がかかりません。 –

+0

コールの場合shouldAutorotateToInterfaceOrientation:ダウンロード後にプログラムが正常に表示されますが、それは正しい解決方法ではありません –

関連する問題