2012-11-23 5 views
0

는 지금은 다음 형식을 사용하여 나를 위해 다운로드 물건을 이동하는 방법 내부 코드 블록을 파견하고 있습니다 :인라인 블록 정의 - 방법?

dispatch_queue_t downloader("downloader", NULL); 
dispatch_async (downloader, ^{ 

//do stuff 

}); 

은 제가 지금하려고하는 것은 그 블록이 나를 위해있는 UIImage 반환이되는 I 메서드의 반환 값으로 사용할 수 있습니다.

-(UIImage *) myMethod: 

dispatch_queue_t downloader("downloader", NULL); 
dispatch_async (downloader, ^{ 

//do stuff to get UIImage 

    dispatch_async (dispatch_get_main_queue, ^{ 

    return UIImage; //this is the image that image I want myMethod to return 

    });  
}); 

어떻게 매개 변수를 호환되지 않는 형식 오류로 전달할 수 있습니까? 블록에 반환 값이 있다고 선언하지 않기 때문입니다.

블록이 dispatch_async에서 바로 UIImage를 반환한다고 어떻게 선언 할 수 있습니까? 이것은 심지어 가능합니까? 또는 블록이 실행을 마칠 때까지 메소드가 이미 완료 되었습니까?

+0

이 발생하는 것입니다 :이 같은 기능의 일부로서 블록을 사용해야합니다'방법이 이미 시간 수행 할 것 블록 실행 완료 –

+0

비동기 메서드는 절대 반환 할 수 없다는 것을 포용하십시오. 스레드에서 실행중인 코드가 주 스레드에서 실행되지 않고 다른 모든 코드가 주 스레드에서 실행되고 위에서 아래로 순차적으로 진행되므로 이러한 비동기 호출에서 어떤 것도 반환 할 수 없습니다 . dispatch_sync를 사용하여 자신 만의 블록을 반환하거나 생성하고 특정 작업이 완료된 후에 실행할 매개 변수로 전달하십시오. – Sandeep

답변

1

음, 리턴을 사용하면 메소드가 동기되어야하므로 솔루션이 없습니다.

- (void)myMethodOnFinish:(void(^)(UIImage *))finishBlock { 

    dispatch_queue_t downloader("downloader", NULL); 
    dispatch_async (downloader, ^{ 

     //do stuff to get UIImage 
     UIImage *result = ...; 

     dispatch_async (dispatch_get_main_queue, ^{ 
     //this is the image that image I want myMethod to return 
      finishBlock(result); 
     });  
    }); 
} 

과 같이 전화 :

[self myMethodOnFinish:^(UIImage *image) { 

    self.imageView.image = image; // or whatever you need to do    

}]; 
관련 문제