2012-07-18 13 views
6

基本的には、ブロックの実行が終了した後にセグを実行する必要があります。私はいくつかのJSONのことをするブロックを持っていて、いつ実行が終了したのかを知る必要があります。dispatch_asyncブロックのチェック方法は終了しました

私はjson_queueと呼ばれるキューを持っています。 ": "[:自己送信者:

dispatch_async(jsonQueue, ^{ 
    [self doSomeJSON]; 
    [self performSegueWithIdentifier:@"modaltomenu" sender:self]; 
    }); 

それは文句を言わない私はラインを実行してみましょう:自己performSegueWithIdentifierを@" modaltomenu];"

jsonQueue = dispatch_queue_create("com.jaboston.jsonQueue", NULL); 

私は、この構文でdispatch_asyncブロックを持っています

メインスレッドまたはウェブスレッド以外のスレッドからウェブロックを取得しようとしました。これは、セカンダリスレッドからUIKitを呼び出した結果である可能性があります。今すぐクラッシュします...

スレッドが汚れた作業をしたときに私はセグを呼び出すことができますか?

ありがとうございます。

PS:ビールと提携し、テディベア、花あなたが唯一のメインスレッド上のUIのメソッドを呼び出す必要があり< 3.

答えて

26

を助けることができる誰に。 performSegueWithIdentifierをメインキューにディスパッチしようとしてください。

dispatch_async(jsonQueue, ^{ 
    [self doSomeJSON]; 
    dispatch_sync(dispatch_get_main_queue(), ^{ 
     [self performSegueWithIdentifier:@"modaltomenu" sender:self]; 
    }); 
}); 
+0

あなたは先生とビールを持っています。 (それは私が探していた答えです!)。私はあなたがいつでもメインキューに戻ることができることを完全に忘れていました。ブリリアント。 – jimbob

+0

私はこのことについて初めてです。これは、ブロック内でperformSelectorOnMainThreadを使用するよりもなぜ優れていますか? –

+0

@jimbob私は、3行目の 'dispatch_async'の代わりに' dispatch_sync'を使ったほうが良いでしょう(私はそれを編集しました)。このパターンは、WWDC2010セッション206ビデオで推奨されます。 @ranReloadedこのような単純なタスクのために全く新しいメソッドを作成する必要がないので、別のブロックを使用する方が便利です。ブロック定義の範囲内のすべての変数にアクセスできます。 – Johnnywho

5
dispatch_async(jsonQueue, ^{ 
     [self doSomeJSON]; 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [self performSegueWithIdentifier:@"modaltomenu" sender:self]; 
      //Finished with async block 

     }); 
    }); 
+0

これも正解ですが、残念ながら上記の男は少し余分な情報で回答しています。しかし、ありがとう! – jimbob

関連する問題