× [PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。 |
アプリ内でNSTimerを発行したいときがある。
◯記述場所 NSTimerは、アプリが起動している間だけ生きていれば良かったので、Model層では扱う必要が無い。 だからViewControllerで完結させるように記述した。 ◯破棄 さて、NSTimerはキャンセルすることもできるようにしたい。 ということは、作成したNSTimerのインスタンスを保持しておく必要がある。 NSTimerインスタンスの生成・破棄及び参照保持と削除のタイミングは、 ・作成ボタン押下 インスタンス化、参照保持 ・キャンセルボタン押下 無効化、参照削除 ・タイマー発動 参照削除(←忘れがちだがここでもちゃんと削除しておく。そうでないとvalidでないNSTimerインスタンスの参照がずっと残ることになる) ということになる。 さてインスタンスの保持の方法だが、 [NSTimer] Array<NStimer> Dictionary NSMutableSet といろいろあるが、試してみて一番便利なのは NSMutableSet だった。 なぜなら、削除したいインスタンスを直接 set.removeObject(timer) という形で指定できるからである。 それ以外の型だと、削除していいインスタンスかどうかの判定のロジックを書かなければならなくなる。 ◯別のViewControllerから生成・削除させる キャンセルは実は別の画面から行われることもある、という場合。 あるViewControllerから別のViewControllerにどうやって情報を伝達するか。 NotificationCenterを使う。 ・通知を発信する側 var notification = NSNotification(name: "RemoveInAppNotification", object: self, userInfo: ["data": declareData!]) NSNotificationCenter.defaultCenter().postNotification(notification) なおuserInfoは必ず Dictionary? 型でないといけない ・通知を受け取る側 NSNotificationCenter.defaultCenter().addObserver(self, selector: "removeInAppNotifications:", name: "RemoveInAppNotification", object: nil) func removeInAppNotifications(notification: NSNotification) { //notification.userInfo などを使って処理 } となる。 nameはもちろん揃っている必要がある。 通知を受け取る側は、addObserver()やremoveObserver()を正しく書いておく必要がある。 画面に出入りしたときにadd/removeObserverしたいところだが、この場合はいけない。 「別の画面から呼び出されたとき」に通知を受け取りたいからである。 もちろん、該当のViewControllerが常にメモリ上に存在している保証が必要だ(そんなことできるのか?) 以上まとめるとコードは以下のようになる
PR |
|