gpt4 book ai didi

objective-c - 发出一个 block 并等待它完成

转载 作者:行者123 更新时间:2023-11-29 11:15:08 29 4
gpt4 key购买 nike

我正在使用 UIImagePickerController 检索图像,我需要检查它是否包含 gps 元数据。这段代码会把它拉出来,但我对这个 block 的计时有疑问。由于我在 assetLibrary 上使用了一个 block ,它会在稍后的时间完成(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;
}

在 block 完成之前运行并记录为(空)。

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

我有什么想法可以让应用程序等到 block 完成吗?

最佳答案

assetForURL:resultBlock:failureBlock: 不像 NSArrayenumerateObjectsUsingBlock: 那样被同步调用。它更像是使用 dispatch_async - 该 block 将被调用,但不一定立即调用。

我要做的是创建另一个方法,您的结果 block 会调用该方法让您的应用程序的其余部分知道一切都已完成。我不相信有任何方法可以让这个调用阻塞线程直到完成 - 也不应该有:

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

您不希望在用户确认或拒绝访问您的应用程序时阻塞主线程的其余部分。这就是为什么它是异步调用的原因。

关于objective-c - 发出一个 block 并等待它完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9813392/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com