忍者ブログ

佐崎司と愉快な仲間達

ゲーム、アニメ、CG、iOS開発など思いついたことを記事にしています。 管理人が3人いますので、記事にまとまりはないと思います。 iPhoneアプリのレビュー依頼も受け付けています。

performSelector:withObject:afterDelayがやっかいな話

わか

iOSにてperformSelector:withObject:afterDelayがあります。
これは、afterDelayで指定した時間分だけ指定メソッドを遅延実行してくれるものです。
今回これが引き金になって、別のメイン処理が実行されなくなる現象が発生しました。

iOS7.1.2

何らかの理由でafterDelay(メインスレッド実行)が遅延実行されない(できない)状態に陥った場合、その後に実行したperformSelectorOnMainThreadがいつまでたっても実行されない状態になりました。
おそらくafterDelayが実行されないので、メインキューにて待ち状態になってしまっているのではないかと思われます。

なのでcancelPreviousPerformRequestsWithTargetにてafterDelayをキャンセルすることによって、performSelectorOnMainThreadが実行されるようになりました。

これ気づきにくいので、afterDelayがなかなかやっかいだなと思いましたね。
(そもそもafterDelayがなぜ実行されない状態になるのかは不明でしたが、今回はキャンセルしても問題なかったのでとりあえず保留にしました)

また、performSelectorOnMainThreadが実行されない状態に陥った場合も同様の現象が発生しました。こちらはキャンセルすることができないので、どうするか検討中です。

拍手[0回]

PR