お?いけるくさい?

iPhoneアプリエンジニアのたまごです。いっちょまえエンジニア目指してちいさな発見や学んだことを覚え書きしていきます!Objective-C/iOS/開発

おさらいというか

前のアプリで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フラグ立ててみたり色々してる。

f:id:simamikiii:20120806162517p:plain

 

どうしたらいいんだーって方法を考えて、

「音を鳴らすタイマーの中で音を止められたら

 なんかうまくいきそうなんやけどな...」

って探しまわって、いーい方法を見つけたんですヽ(´ω)ノ

 

それがこちら!

f:id:simamikiii:20120806162659p:plain

 

_kaisu++以下でどーんと解決致しました∩(´∀`)∩!

*変数の解説(とりあえず)

_kaisu      →(int)音が何回繰り返されたかをカウントする

_skipPassed →(BOOL)フラグ。スキップボタンが押されていた場合YES

_maxNum  →(int)リピート回数の最大値

 

私が音を止めたいタイミングっていうのは以下の2パターン。

①スキップボタンが押されたら、その場で音を止めたい

②スキップボタンが押されなかったら、最大値まで鳴らして止めたい

 

ポイントはこの_kaisu++ちゃん。

こうやって書くと、1回タイマーが呼ばれることに、1+されていくのです。

あとはif文で①②の条件を提示すれば、

「タイマーよ死んでくれ!そうして音よ止まれ!」

と呼べるのです。

 

そうなると今度音を止めるタイマーなんてものは不要になりますね(∀`*)

こうしてStopタイマーちゃんはエラーもろとも滅(メツ)!

したのでした。ちゃんちゃん。