发出一个块并等待它完成

时间:2012-03-21 21:49:57

标签: objective-c ios block

我正在使用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)。

我认为在主线程上调用它会让它等到块完成,但事实并非如此。

任何想法如何让应用程序等到块完成?

1 个答案:

答案 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.

当用户确认或拒绝访问您的应用程序时,您不希望其他主线程被阻止。这就是为什么它是异步调用。