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;
}
運行完成並且記錄作爲(空)。
我以爲在主線程上調用它會使它等到塊完成,但它不會。
任何想法如何讓應用程序等待塊完成?
有一種方法可以等待塊被調用。你所要做的就是手動運行運行循環,並讓塊設置一個變量來表明它已完成。這會讓其他事件在不返回時處理。 – ughoavgfhw 2012-03-21 22:02:20
你*可以*,但這是一個壞主意。 Apple設計他們的API,以便這些類型的長時間運行的操作不會阻塞主線程。當你可以從'resultBlock'參數中調用一個方法時,爲什麼要繞過這種設計? – 2012-03-21 22:05:59
+1不要阻止主線程! GUI和所有那些 – 2012-03-21 23:46:50