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
を使用すると、ボタンのサムネイルが表示されません。私は何かが間違っていることを知っていますが、私は何がわかりません。
どうすれば修復できますか?
ありがとうございます。
ありがとうございます!それは動作していますが、なぜaddSubviewはメインキューになければなりませんか?あなたは私にそれを説明できますか? –
ディスプレイ(UIViews)を更新またはタッチするものはすべて、メインキューで処理する必要があります。私の理解では、UIの多くはスレッドセーフではありません(スレッドセーフではありません)。 –