おさらいというか
前のアプリでNSTimerをめっちゃ使ったのでまとめ。
私は今回「タイマーで効果音をリピート再生」して、
その音を「任意のタイミングで止める」っていうことをしたかった。
はじめに思いついた方法は、
音を再生させるタイマー(A) と
音を停止させるタイマー(B) を作って作動させること。
この記事http://montan.hateblo.jp/entry/20120626/1340699489とか見てもらったら
2種類あるのがわかると思う。
音を再生させるタイマー(A)のほうは、
一定のタイムインターバルで効果音を鳴らし続けて、
やめさせたいタイミングで音を停止させるタイマー(B)を走らせれば
うまくいくと思ったのだ。
Aのほうは何回も呼びたいのでrepeats:YESにして
Bのほうは1回だけ走らせればいいのでrepeats:NOにする。
でここに付加情報として、
NSTimerというものは関数を抜けると消滅してしまうので、
allocもreleaseもしない実装をした。
[timer fire]とか書かずに、処理の流れで走らせて、そのまま消え去らせる。w
走らせるのは勝手に走ってくれるんやけど、
じゃぁ止めたいときは?っつったら、
repeats:YESにしたタイマーは[timer invalidate]で止めなきゃ死んでくれない。
repeats:NOにしたタイマーは放っとけば関数を抜けたタイミングで死ぬ。
ではなぜそれと同じようにとAのタイマーを止められなかったかというと、
タイマーを止めるタイミングがいつも一定じゃなかったから。
Aのタイマーの処理が繰り返される時間も毎回違うし、
それを止めたいタイミングも毎回違ったもんだから、
invalidateだけでは止めきれなかったの。
そんで、このAとB2つのタイマーで実装をしてみたんやけど、
これがエラー祭りで。
ちゃんと止まってくれなくていつまでも音が鳴り続ける
っていうホラーな現象に見舞われたり
エラーじゃ!っつって落ちたり。
タイマーBのメソッドの格闘の跡wフラグ立ててみたり色々してる。
どうしたらいいんだーって方法を考えて、
「音を鳴らすタイマーの中で音を止められたら
なんかうまくいきそうなんやけどな...」
って探しまわって、いーい方法を見つけたんですヽ(´ω)ノ
それがこちら!
_kaisu++以下でどーんと解決致しました∩(´∀`)∩!
*変数の解説(とりあえず)
_kaisu →(int)音が何回繰り返されたかをカウントする
_skipPassed →(BOOL)フラグ。スキップボタンが押されていた場合YES
_maxNum →(int)リピート回数の最大値
私が音を止めたいタイミングっていうのは以下の2パターン。
①スキップボタンが押されたら、その場で音を止めたい
②スキップボタンが押されなかったら、最大値まで鳴らして止めたい
ポイントはこの_kaisu++ちゃん。
こうやって書くと、1回タイマーが呼ばれることに、1+されていくのです。
あとはif文で①②の条件を提示すれば、
「タイマーよ死んでくれ!そうして音よ止まれ!」
と呼べるのです。
そうなると今度音を止めるタイマーなんてものは不要になりますね(∀`*)
こうしてStopタイマーちゃんはエラーもろとも滅(メツ)!
したのでした。ちゃんちゃん。