0

iOS では、メイン スレッドが必要なときにバックグラウンド スレッドから API への呼び出しが行われたときに検出/発生するように設定できる NSZombies フラグに似たものがあるかどうか疑問に思っています。

ブロックを使用すると、どのスレッドが何を行っているかについて誤った仮定をしたり、間違いを犯したりする状況に陥りやすいようです。間違ったスレッドからの呼び出しを検出できるデバッグ フラグは、これらのケースを見つけるのに非常に役立ちます。

私が関心を持っているのは主に Apple のフレームワークです (Cocoa Touch)。

バグ レポート #12180446 を提出しました。

4

2 に答える 2

2

メインスレッド上にある必要があるAPIで以下を使用します。

NSAssert([NSThread isMainThread], @"This must only be called on the main thread.");

Appleは、UIKitのすべてをカバーするようなものを提供していません。必要なときに呼び出す必要があります。

于 2012-08-23T18:45:32.470 に答える
1

もっと実践的なことをします。ブロックを呼び出すとき。私はカスタムメソッドでそれを行います。

+ (void) ensureDispatchOfBlock:(dispatch_block_t) block onQueue:(dispatch_queue_t) queue  async:(BOOL) async{
    if (queue == nil || dispatch_get_current_queue() == queue){
        block();
    }
    else {
        if (async){
            dispatch_async(queue, block);
        }
        else {
            dispatch_sync(queue, block);
        }
    }
}


+ (void) ensureDispatchOnMainThread:(dispatch_block_t) block async:(BOOL) async{
    [self ensureDispatchOfBlock:block onQueue:dispatch_get_main_queue() async:async];
}

これにより、提供されているブロックのディスパッチが意図したブロックで発生することを「保証」できます。

async:NO非常に控えめに使用することを忘れないでください。

于 2012-08-23T18:55:51.200 に答える