2012-04-25 16 views
0

イムをdipatchingし、その中にコードだが、このような方法があります:アプリケーションブロック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]; 
    } 
} 

アプリは、私はそれを一時停止何もしていないので、[EDIT]一貫性 このブロックではなく、常には、スレッドがそこで停止していて、実行を続行していないことがわかります。 どうしたのですか?何か案は?

おかげ

+0

ゾンビオブジェクトを有効にしてみてください。 http://stackoverflow.com/questions/5386160/how-to-enable-nszombie-in-xcode –

+0

あなたはそれがクラッシュ知ってどうすればよいですか? – zrxq

+0

正確なエラー/クラッシュメッセージとバックトレースを表示します。 –

答えて

3

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

+1

さて、たとえmoduleQueueがメインキューでなくても、コードがメインスレッドから呼び出された場合、アプリケーションはバックグラウンドスレッドで作業が完了するまでフリーズします。また、別のスレッドがmoduleQueueで実行されているブロック内のメインスレッド/キューと同期しているデッドロックである可能性があります。 –

+0

現在のキューがメソッドがディスパッチするキューである場合、コードはすでに 'dispatch_sync'を呼び出しません。おそらく、 'moduleQueue'はメインキューではありません(または、他のキューからコールされています)。待ち行列はちょうど本当に忙しいか、何か他のものでブロックされています。 –

+0

@PeterHoseyの言うことは正しいとはいえ、それは問題を解決しました... – subharb

0

ブロックは時々、彼らが実行するとき、彼らが利用可能であることを確認するために、変数を保持する必要があります。ブロック内でローカル変数を使用する場合は、そのブロックをブロック外に宣言する場所をゼロに初期化する必要があります。

+1

ブロックは暗黙的に '__block'で宣言された変数の値を保持しません。また、質問者がARCを使用している場合、変数はすでに暗黙的に 'nil'に初期化されています。 –

関連する問題