performSelectorOnMainThreadは実行されません

これに私の髪を引き裂く、どんな考えや提案も大歓迎です。

子スレッドから performSelectorOnMainThread:withObject:waitUntilDone:を呼び出すオブジェクトがあります。これは95%の時間で正常に機能します。 iOSのベータ版からリリースされるたびに、デバイスは performSelectorOnMainThread:withObject:waitUntilDone:の呼び出しを拒否します。エラーメッセージは表示されません。デバイスを「失敗」状態にするが、一旦そこにいれば、アプリケーションを削除して再インストールするか、強制的に終了してからロケーションサービスの手当を調整してから再度起動するまで、それから再度位置情報サービスを通常どおりに再調整してください。デバイスを再起動しても問題は解決しません。最初に削除せずに再インストールしても問題は解決しません。非常に奇妙なことです....ほとんどのデバイスに問題はないため、ほとんどの場合動作しますが、一部のデバイスは定期的に(3〜4日ごとに)失敗します。私は特に、 performSelectorOnMainThread:withObject:waitUntilDone:が失敗したデバイスを持っているために何を呼び出すべきでないかを知っており、NSLogを呼び出すメソッドに入れました。それはうまく機能しますが、 performSelectorOnMainThread:withObject:waitUntilDone:を使用してそのメソッドを呼び出すと、NSLogが実行されていないことを示します。

これは、iOS 5ベータ版で起こり始めて、再びリリースされます。これは私のデバイスの2つで最も頻繁に起こりますが、私が個人的にテストした他の10個のデバイスのどれにも当てはまりません。私はそれがベータ版のいくつかの問題からちょうど私のデバイスだと思ったが、ベータ版に触れなかった私の新しい4Sと、1人のユーザーのiPad 2(私のiPad 2ではなく)で起こる。

私は本当にどこを見るか分からない。私はそれを実行するように指示し、それは通常ほとんどすべてのデバイス上で行いますが、同じ行には応答や何らかのエラーなどはありません...

5
@piccianoどうやってこれを回避できましたか?私は同じ問題が発生していると私はデッドロックを修正するために何をする必要があるのか​​分からない。
追加された 著者 Duncan Groenewald,
万が一CoreDataを使用していますか?私も同様の問題がありました。実際に起こったのは、他のスレッドが書き込みを試みている間にCoreDataを使用して読み取り操作を実行するのを待っているスレッドデッドロックでした。
追加された 著者 picciano,

2 答え

performSelectorOnMainThread:withObject:waitUntilDone can be wonky sometimes. Have you thought about trying to use lib dispatch?

ブロックを作成し、メインスレッドに以下のように投稿することができます:

dispatch_async(dispatch_get_main_queue(), ^{
    
});

This would have the same save affect as using performSelectorOnMainThread:withObject:waitUntilDone http://developer.apple.com/library/ios/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html#//apple_ref/doc/uid/TP40008091-CH102-SW1

3
追加された

スレッドの RunLoop にはいくつかの異なるモードがあります。 呼び出し中にメインスレッドがデフォルトのもの( performSelectorOnMainThread:withObject:WaitUntilDone:の対象となるモード)と異なるモードで実行されている可能性があります。

performSelectorOnMainThread:withObject:waitUntilDone:modes:の使用を検討する
Appleのドキュメントをご覧ください。

また、 - GCD(libdispatch)はすばらしいですが、あなた自身を料理することからあなたを守ることはできません: あなたのメソッドがメインスレッド上で実行されており、あなたが呼び出している場合を考えてみましょう:

dispatch_sync(dispatch_get_main_queue(), ^{
    
});
0
追加された