performselectorで実行を遅らせる
iOSアプリ開発の話です。
テスト用のアプリで基本的な動きを学びながら、分かったところで本命アプリに組み込むなんて方法で開発しているのですが、ちょっと複雑にするとすぐ問題が出てきます。
今日発生した問題は画面遷移中に落ちてしまうという問題。
A.「ボタンをタップすると0.3秒のアニメーションがあって、アニメーション後に画面を書き換える」という処理と、
B.「0.1秒毎にtimerを動かしていて、指定した時間が過ぎると時間切れで画面遷移する」という処理があったのですが、
時間切れギリギリにボタンをタップすると、画面遷移のためにviewWillDisappearで変数をnil化した後にAの画面書き換え処理が動いてしまって、nil化した変数にアクセスしてしまい例外が発生していました。
これ、どうしようかと思いましてまずは画面書き換え処理の前にフラグを立てて、処理終了後にフラグを下ろす。フラグが上がっている間は画面遷移せずに待つ。
という方法にしてみました。
一定時間実行を遅らせるために使ったのはこれ。
[NSThread sleepForTimeInterval:0.5];
これで0.5秒待つ。フラグが下りてなかったら再度待つ。5秒待ってもフラグが下りなければ画面遷移強行。ってやってみたのですが、確かにスリープはしていますが、それでもタイミングによっては落ちます。
このsleepForTimeIntervalってのは画面遷移の時間を遅らせると同時に、画面書き換えの処理も止めちゃってますよね?
これじゃ意味ない。
ってわけで次は performselector ってのを使ってみます。
[self performSelector:@selector(OpenNext) withObject:nil afterDelay:0.5];
これで OpenNext という関数を0.5秒後に実行してくれます。
スリープしているわけではないのでその間に画面書き換えの処理は動いて完了してる(っぽい)。
これでどうにか落ちることはなくなりました。