0

下面的代码将异步加载资产的值。我使用while循环等待它。

    AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:aAudioLink options: nil];
    [asset loadValuesAsynchronouslyForKeys:keys 
                 completionHandler:^{                                           
                canExit = TRUE;
                         }];

    while (canExit == FALSE) {
        // NSLog (@"canExist = FALSE");     
    }

    NSLog(@"canExist = TRUE");

如果 NSLog 语句像上面的代码一样被注释,最后的 NSLog 将不会被调用。如果没有注释 NSLog 语句,则调用最后一个 NSLog。

块和块外的代码在不同的线程上运行,并且两者都不是主线程。

这是什么原因?

4

1 回答 1

0

我认为您不应该为此使用while循环。最近我正在处理一个应用程序,在该应用程序中我必须使用 AVAsset 为资产生成缩略图。我最终使用调度信号量来阻塞线程,直到图像异步生成。

为什么你不能尝试以下。

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

 AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:aAudioLink options: nil];

dispatch_async(queue, ^{

[asset loadValuesAsynchronouslyForKeys:keys 
             completionHandler:^{                                           
            canExit = TRUE;
            dispatch_semaphore_signal(sema);
             }];
    });



dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
dispatch_release(sema);

如果我是对的,它应该可以工作。

于 2013-01-03T14:03:13.830 回答