私のアプリでは、以下のメソッドを使用して、メインスレッドでのみアクセスできる特定の変数の値を調べます。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キューに入れるか、他に何か不足していますか?
ありがとうございます!
これがデッドロックの原因となったと思いますか?私はバックグラウンドではなく、代わりに私のアプリは 'アクティブモード'であれば、それは完全に動作します。私は、現在のスレッドがデッドロックを回避するためのメインスレッドであるかどうかをチェックすることさえできます。 – McMini
私の意見は、メインキューのdispatch_syncを実行するスレッドからは関係ありません。あなたのブロックを開始する前に、すべてを待っているメインキューが完了しているので。しかし、これはあなたのブロックが待ち行列に入っており、派遣を待っているために起こることはありません。あなたは自分をブロックする。たぶん私の説明は最高ではありませんが、これは基本的に関連する問題に書かれています。 –
どのくらいのシンクコールが必要かわかりません。しかし、私は非同期呼び出しでメインスレッド上でのみ実行するようにメソッドを単純化しようとします。 dispatch_async(dispatch_get_main_queue()、^ {prmBlock()} –