2012-03-21 49 views
1

我檢索與UIImagePickerController的圖像,我需要檢查它是否有gps元數據在它或不。這段代碼將把它拉出來,但我在與塊的時間有關的問題。因爲我在assetLibrary上使用了一個塊,所以它會在稍後時間完成(稍微提高一點點)。問題與塊,並等待它完成

if ([info objectForKey:UIImagePickerControllerReferenceURL]) 
{ 
    [self performSelectorOnMainThread:@selector(testMethod:) withObject:[info objectForKey:UIImagePickerControllerReferenceURL] waitUntilDone:YES]; 

    NSLog(@"self.metadataDictionary back in impagepickerdidfinish: %@", self.metadataDictionary); 
} 

}

-(void)testMethod:(NSURL *) photoURL 
{   
     ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; 

     [library assetForURL:photoURL resultBlock:^(ALAsset *asset) { 
      ALAssetRepresentation *representation = [asset defaultRepresentation]; 
      NSDictionary *metadataDict = [representation metadata]; 
      self.metadataDictionary = metadataDict; 
      NSLog(@"self.metadataDictionary in block: %@", self.metadataDictionary); 

     } failureBlock:^(NSError *error) { 
      NSLog(@"%@",[error description]); 
     }]; 
} 

行了塊之前

NSLog(@"self.metadataDictionary back in impagepickerdidfinish: %@", self.metadataDictionary); 

2012-03-21 16:40:47.110[9387:707] self.metadataDictionary back in impagepickerdidfinish: (null) 
2012-03-21 16:40:47.265[9387:707] self.metadataDictionary in block: { 
    ColorModel = RGB; 
} 

運行完成並且記錄作爲(空)。

我以爲在主線程上調用它會使它等到塊完成,但它不會。

任何想法如何讓應用程序等待塊完成?

回答

2

assetForURL:resultBlock:failureBlock:未被同步調用,如NSArrayenumerateObjectsUsingBlock:。這更像是使用dispatch_async - 該塊將被調用,但不一定馬上。

我會做的是創建另一個方法,您的結果塊調用讓其他應用程序知道一切都已完成。我不相信有什麼辦法讓這個呼叫阻塞線程直到完成 - 而且也不應該有:

When the ALAsset is requested, the user may be asked to confirm the application's access to the data. 

你不想阻塞主線程的其餘部分,而用戶確認或否認訪問您的應用程序。這就是爲什麼它是一個異步調用。

+0

有一種方法可以等待塊被調用。你所要做的就是手動運行運行循環,並讓塊設置一個變量來表明它已完成。這會讓其他事件在不返回時處理。 – ughoavgfhw 2012-03-21 22:02:20

+1

你*可以*,但這是一個壞主意。 Apple設計他們的API,以便這些類型的長時間運行的操作不會阻塞主線程。當你可以從'resultBlock'參數中調用一個方法時,爲什麼要繞過這種設計? – 2012-03-21 22:05:59

+0

+1不要阻止主線程! GUI和所有那些 – 2012-03-21 23:46:50