iphone - 等待 assetForURL block 完成

标签 iphone objective-c alasset alassetslibrary

我想等待此代码执行后再继续,但由于这些 block 是异步调用的,我不知道该怎么做???

NSURL *asseturl;
NSMutableArray *tmpListAsset = [[NSMutableArray alloc] init];

ALAssetsLibrary *library = [[[ALAssetsLibrary alloc] init] autorelease];
NSMutableArray *objectsToRemove = [[NSMutableArray alloc] init];
for (NSDictionary *dico in assetsList) {
    asseturl = [NSURL URLWithString:[dico objectForKey:@"assetUrl"]];
    NSLog(@"asset url %@", asseturl);
    // Try to load asset at mediaURL
    [library assetForURL:asseturl resultBlock:^(ALAsset *asset) {
        // If asset doesn't exists
        if (!asset){
            [objectsToRemove addObject:dico];
        }else{
            [tmpListAsset addObject:[asseturl absoluteString]];
            NSLog(@"tmpListAsset : %@", tmpListAsset);
        }
    } failureBlock:^(NSError *error) {
        // Type your code here for failure (when user doesn't allow location in your app)
    }];
}

最佳答案

GCD 信号量方法:

dispatch_semaphore_t sema = dispatch_semaphore_create(0);
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);

for (NSURL *url in self.assetUrls) {
    dispatch_async(queue, ^{
        [library assetForURL:url resultBlock:^(ALAsset *asset) {
            [self.assets addObject:asset];
            dispatch_semaphore_signal(sema);
        } failureBlock:^(NSError *error) {
            dispatch_semaphore_signal(sema);
        }];
    });
    dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
}
dispatch_release(sema);

/* Check out ALAssets */
NSLog(@"%@", self.assets);

关于iphone - 等待 assetForURL block 完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7234445/

相关文章:

ios - 基于重复子字符串或 2 个字符串之间的差异的 NSString 压缩

objective-c - 转换为 Swift 3 重命名了我自己的 Objective-C 方法

ios - 访问图库中的连拍模式照片

ios - 从自定义相册中删除图像

iphone - 从 ALAssset 检索时的 CGImage 方向问题

iphone - 当用户按下按钮显示日期选择器 View 并选择日期然后显示为按钮标题并进一步关闭日期选择器 View

ios - iOS11 的低功耗模式会影响修改 Shadow DOM 元素的伪元素吗?

iphone - UIDocument 和一个 NSDictionary

ios - 创建一个可以包含 iOS 中其他应用程序的应用程序

iphone - Core Location 不断请求许可