0

XMPPFrameworkを使用していて、そのコードには次のようなメソッドがあります。

- (NSDictionary *)occupants
{
    if (dispatch_get_current_queue() == moduleQueue)
    {
        return occupants;
    }
    else
    {
        __block NSDictionary *result;

        dispatch_sync(moduleQueue, ^{//IT BLOCKS HERE, WITHOUT MESSAGE
            result = [occupants copy];
        });

        return [result autorelease];
    }
}

[編集]アプリが何もしていないため、常にブロックされるとは限りません。一時停止すると、スレッドがそこで停止し、実行が継続されなくなります。なにが問題ですか?何か案は?

ありがとう

4

2 に答える 2

3

説明する動作は、メインスレッド上にいるときにGCDを介してメインスレッド上で操作を実行しようとしたときに表示される動作と完全に一致します。したがって、moduleQueueがメインキューであるかどうかを確認する必要があります。これがメインキューです。メインキューであるかどうかを確認してみてください。メインキューである場合は、dispatch_syncブロックをスキップしてください。

于 2012-04-25T17:10:11.430 に答える
0

ブロックは、実行時に使用できるようにするために変数を保持する必要がある場合があります。ブロック内でローカル変数を使用する場合は、ブロック外で宣言する場所でゼロに初期化する必要があります。

于 2012-04-25T13:14:38.563 に答える