__block变量的值不会更改

时间:2013-01-03 10:44:02

标签: iphone multithreading thread-safety objective-c-blocks avurlasset

以下代码将异步加载资产的值。我等待使用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。

块和块外部的代码在不同的线程上运行,这两个线程都不是主线程。

这是什么原因?

1 个答案:

答案 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);

如果我是对的,它应该有效。