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 に答える