2011-10-27 49 views
5

私の髪を引き裂くと、どんな考えや提案も大歓迎です。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ではなく)で起こる。

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

+0

はあります万が一CoreDataを使用していますか?私も同様の問題がありました。実際に起こったのは、他のスレッドが書き込みを試みている間にCoreDataを使用して読み取り操作を実行するのを待っているスレッドデッドロックでした。 – picciano

+0

@piccianoどのようにこれを回避しましたか?私は同じ問題が発生していると私はデッドロックを修正するために何をする必要があるのか​​分からない。 –

答えて

3

performSelectorOnMainThread:withObject:waitUntilDoneはときどきうまくいくことがあります。 libディスパッチを使用しようと考えましたか?

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

dispatch_async(dispatch_get_main_queue(), ^{ 
    <do work here> 
}); 

これは、同じスレッドのRunLoopは、いくつかの異なるモードがありperformSelectorOnMainThread:withObject:waitUntilDone http://developer.apple.com/library/ios/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html#//apple_ref/doc/uid/TP40008091-CH102-SW1

0

を使用して影響を与える保存しなければなりません。 時間の間、あなたは、メインスレッドがperformSelectorOnMainThread:withObject:WaitUntilDone:の対象となるものですデフォルト1(とは異なるモードで実行されているあなたの電話をかけることも可能である。

performSelectorOnMainThread:withObject:waitUntilDone:modes:
Apple's documentationを参照してください使用することを検討してください。

また、 - GCD(libdispatchは)素晴らしいですが、それは自分でデッドロックを調理するからあなたを保護しません:あなたの方法は、メインスレッド上で実行されている場合を考えてみましょう 、あなたが呼んでいる:

dispatch_sync(dispatch_get_main_queue(), ^{ 
    <do work here> 
}); 
関連する問題