2013-11-26 38 views
0

返回圖像我想能夠從解析獲取的圖像是這樣的:使用信號燈從解析

-(UIImage *) image { 

    __block NSData * imageData; 
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); 

    [self.imageFile getDataInBackgroundWithBlock:^(NSData *data, NSError *error) { 
     imageData = data; 
     dispatch_semaphore_signal(semaphore); 
    }]; 

    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); 
    return [UIImage imageWithData:imageData]; 
} 

但由於塊上的郵件線程執行和信號燈等待的主線程,塊永遠不會執行。我如何重做我的代碼?我需要能夠返回沒有completionBlock的圖像,因爲這個方法是由我使用的庫調用的。

+0

你想從後臺加載圖片,然後在主線程中更新? – chancyWu

+0

我只是想在imageData設置好後執行return語句。解析在後臺加載數據,然後調用主線程上的塊。 –

回答

0

完成塊在主線程上運行......阻塞等待信號量。你在這裏陷入僵局。你有沒有考慮過在後臺線程中使用同步getData來獲取信息呢?

+0

我不希望它在主線程上運行。它應該在該函數被調用的任何線程上運行。我可以這樣做嗎? –

+0

是的。使用getData。 –

+0

如果希望在此方法中封裝dispatch_async。但我想我必須使用getData。 –

1

您可以嘗試使用GCD在後臺解析並加載,然後在主線程中使用該圖像。代碼可能如下:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     UIImage *image = nil; 
     __block NSData *imageData; 
     [self.imageFile getDataInBackgroundWithBlock:^(NSData *data, NSError *error) { 
      imageData = data; 
     }]; 
     image = [UIImage imageWithData:imageData]; 

     dispatch_sync(dispatch_get_main_queue(), ^{ 
      if (image) { 
       return image; // use your image here. 
      } 
     }); 

    });