何回も呼ばれるメソッドで1度だけ行いたい処理の記述方法をまとめました。
やり方はたくさんありますが、これが1番私的には使いやすかったです。
1番簡単な方法
class OnceTrackerSample1 {
var isFirst = Bool
func manyCalledFunc() {
if !isFirst { return }
// 1回のみ行いたい処理
}
}
1番最初に全ての人間が思いつきそうな処理。
やっぱりダサいので、使い勝手よくカッコよく書きたい。
DispatchQueueを拡張して使いやすくする
DispatchQueue
をextension
します。
private static var _onceTracker = [String]()
class func once(token: String, block:()->Void) {
// 排他制御
objc_sync_enter(self); defer { objc_sync_exit(self) }
// token: Stringで一意に実行状況を管理しています
if _onceTracker.contains(token) { return }
// 実行履歴を残して、block:()->Voidで渡された処理を実行
_onceTracker.append(token)
block()
}
使う側はこんな感じです。
class OnceTrackerSample1 {
func manyCalledFunc() {
DispatchQueue.once(token: "key name") {
// 1回のみ行いたい処理
}
}
}
スマートでいい感じ!
String
のkey
はどこかでまとめて管理したらより使いやすそう。