2012-11-23 18 views
0

現在我分派方法內部的代碼塊使用以下格式去下載的東西對我來說:在線塊定義 - 如何?

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

//do stuff 

}); 

什麼,我想現在要做的就是有塊返回一個UIImage對我來說,這是我然後可以使用該方法的回報:

-(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    

}];