以下代码将异步加载资产的值。我等待使用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。
块和块外部的代码在不同的线程上运行,这两个线程都不是主线程。
这是什么原因?
答案 0 :(得分: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);
如果我是对的,它应该有效。