2017-07-14 4 views
0

私のアプリでは、以下のメソッドを使用して、メインスレッドでのみアクセスできる特定の変数の値を調べます。iOS ObjC:アプリがバックグラウンドでAPNのフェッチを受信して​​いる間、mainThreadのdispatch_syncが機能しないのはなぜですか?

は今、私はのAPNを実装するために始めたと私のアプリは、APNので起こされたとき、それは(バックグラウンドで)そのコードの実行と思われるが、常にポイントで固定されているとのコメントを使用して示さ:

- (void) xttSyncOnMainThread:(void (^)(void))prmBlock { 
    if (![NSThread isMainThread]) { 
     dispatch_queue_t mtQueue = dispatch_get_main_queue(); // will be executed 
     // execution is stuck here 
     dispatch_sync(mtQueue, prmBlock); // won't be executed 
    } else { 
     prmBlock(); 
    } 
} 

は、私が移動する必要がありますすべてのコードを非MTキューに入れるか、他に何か不足していますか?

ありがとうございます!

答えて

0

をブロックしたくない場合は[OK]を、いくつかのより多くのテストの後、私は(問題のコードはうまく動作しますが)私の場合には問題が誤ってからcompletionhandlerの呼び出しから来たことがわかりましたあまりにも早くAPNが委任します。

0

メインキューのdispatch_syncがデッドロックを引き起こすためです。 dispatch_syncとメインキューについて

詳しい情報はこちら例えばです:

dispatch_sync on main queue hangs in unit test

Why dispatch_sync() call on main queue is blocking the main queue?

あなただけdispatch_asyncメソッドを使用することはできますか?

+0

これがデッドロックの原因となったと思いますか?私はバックグラウンドではなく、代わりに私のアプリは 'アクティブモード'であれば、それは完全に動作します。私は、現在のスレッドがデッドロックを回避するためのメインスレッドであるかどうかをチェックすることさえできます。 – McMini

+0

私の意見は、メインキューのdispatch_syncを実行するスレッドからは関係ありません。あなたのブロックを開始する前に、すべてを待っているメインキューが完了しているので。しかし、これはあなたのブロックが待ち行列に入っており、派遣を待っているために起こることはありません。あなたは自分をブロックする。たぶん私の説明は最高ではありませんが、これは基本的に関連する問題に書かれています。 –

+0

どのくらいのシンクコールが必要かわかりません。しかし、私は非同期呼び出しでメインスレッド上でのみ実行するようにメソッドを単純化しようとします。 dispatch_async(dispatch_get_main_queue()、^ {prmBlock()} –

-1
- (void) xttSyncOnMainThread:(void (^)(void))prmBlock { 

    dispatch_async(dispatch_get_main_queue(), ^{ 
    //code here to perform 
    }); 
} 
0

は、なぜあなたは

通常それは

dispatch_sync(dispatch_get_main_queue(), ^(void) { 
     // write the code that is to be executed on main thread 
}); 

のようなものです。しかし、あなたはそれが実行を完了してから返すようにブロックを待ちますdisptch_sync使用している場合をdispatch_syncするprmBlockを渡しています。あなたは、実行使用

dispatch_async(dispatch_get_main_queue(), ^(void) { 
     // write the code that is to be executed on main thread 
}); 
+0

私はすでにメインスレッドに入っているかどうかを確認するためにコードを複製することを避けるために、パラメータ付きのメソッドを使用します – McMini

+0

あなたは何をしたいのですか?メインスレッドで何をしたいのですか^(void){ //メインスレッドで実行されるコードを書きます } prmBlockをキューがどこで実行されるか、その場合はprmBlockを使用して何かをしたいのですか? – hariszaman

関連する問題