2012-05-07 7 views
0

私は自分自身のアプリケーションプロジェクトでGCDを学びたいと思っています。私は簡単だと思いますが、どのように解決しているのか分かりません。は、GCDの1つの方法から始めて助けが必要です - 多くの呼び出し

- (void)viewDidLoad 
{ 

[super viewDidLoad]; 

queue = dispatch_queue_create("com.fe.effect.load", NULL); 

__block UIImage *th; 

dispatch_sync(queue, ^{ 
    th = [self doThumbWithImage:thumbnail andTag:1]; 
    UIButton *btn1 = [self buttonWithFrame:CGRectMake(0, 0, 200, 100) andBackgroundImage:th andSelector:@selector(doEffect:) andTag:1]; 
    [self.view addSubview:btn1]; 
}); 


dispatch_sync(queue, ^{ 
    th = [self doThumbWithImage:thumbnail andTag:2]; 
    UIButton *btn2 = [self buttonWithFrame:CGRectMake(0, 100, 200, 100) andBackgroundImage:th andSelector:@selector(doEffect:) andTag:2]; 
    [self.view addSubview:btn2]; 
}); 

} 

及び2の方法:私は2つの方法を持っている

-(UIImage *)doThumbWithImage:(UIImage *)_img andTag:(int)_tag { 

ImageProcessing *ip = [[ImageProcessing alloc] initWithImage:_img andTag:_tag]; 
[ip doImageProcessing]; 
_img = ip.image; 
ip = nil;  

return _img; 

}

そして、私は私thumbnailオブジェクトで何かをImageProcessingクラスを持っているdoThumbWithImage:andTag:

dispatch_syncを使用する場合、この操作の時間はGCDなしと同じです。 dispatch_asyncを使用すると、ボタンのサムネイルが表示されません。私は何かが間違っていることを知っていますが、私は何がわかりません。

どうすれば修復できますか?

ありがとうございます。

答えて

1

おそらくメインスレッドでaddSubviewを実行する必要があります。 dispatch_async呼び出しをネストすると、それを処理できます。

+0

ありがとうございます!それは動作していますが、なぜaddSubviewはメインキューになければなりませんか?あなたは私にそれを説明できますか? –

+1

ディスプレイ(UIViews)を更新またはタッチするものはすべて、メインキューで処理する必要があります。私の理解では、UIの多くはスレッドセーフではありません(スレッドセーフではありません)。 –

関連する問題