我正在使用UIImagePickerController检索图像,我需要检查它是否包含gps元数据。这段代码将把它拉出来,但我遇到了块的定时问题。由于我在assetLibrary上使用了一个块,它将在稍后完成(abit,几分之一秒)。
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;
}
在块完成之前运行并记录为(null)。
我认为在主线程上调用它会让它等到块完成,但事实并非如此。
任何想法如何让应用程序等到块完成?
答案 0 :(得分:2)
assetForURL:resultBlock:failureBlock:
不会像NSArray
的{{1}}那样同步调用enumerateObjectsUsingBlock:
。它更像是使用dispatch_async
- 将调用块,但不一定会立即调用。
我要做的是创建一个结果块调用的另一个方法,让你的应用程序的其余部分知道一切都已完成。我不相信有任何方法可以让这个调用阻塞线程直到完成 - 而且也不应该:
When the ALAsset is requested, the user may be asked to confirm the application's access to the data.
当用户确认或拒绝访问您的应用程序时,您不希望其他主线程被阻止。这就是为什么它是异步调用。