2012-05-07 4 views
0

나는 내 자신의 app-project에서 GCD를 배우고 싶습니다. 문제가 있습니다. 나는 쉽다라고 생각한다. 그러나 나는 그것을 어떻게 해결하는지에 관해 모른다.GCD 한 가지 방법으로 시작하는 데 도움이 필요합니다 - 많은 전화

- (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 방법 : 그래서 난이 방법을 가지고

-(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을 사용하면 버튼의 thumbanils를 볼 수 없습니다. 나는 뭔가 잘못되었다는 것을 알고 있지만, 나는 무엇을 모른다.

어떻게 복구하나요?

도움에 감사드립니다.

답변

1

아마도 주 스레드에서 addSubview를 수행해야합니다. dispatch_async 호출을 중첩하여 처리 할 수 ​​있습니다.

+0

감사합니다. 작동하지만 addSubview가 메인 대기열에 있어야하는 이유는 무엇입니까? 그걸 설명 할 수 있니? –

+1

디스플레이 (UIViews)를 업데이트하거나 터치하는 모든 것이 기본 대기열에서 수행되어야합니다. 내 이해는 UI의 대부분이 스레드 안전하지 않거나 스레드가 안전하지 않다는 점입니다. –

관련 문제