iOS swift timer管理

我們知道在iOS中Timer很容易引起引用循環(huán)谷羞。原因大家都很清楚就是Timer在運行后不僅會被當(dāng)前的target所引用,也會被runloop引用椰拒,timer本身依賴runloop來計時至扰。設(shè)置timer=nil都不行搔预。必須要調(diào)用Timer的invalidate()方法。在官方文檔中就闡述了invalidate()方法的作用

invalidate()
Stops the timer from ever firing again and requests its removal from its run loop.

使用timer還有一個需要注意的就是我們在程序中可能有很多地方都會使用到timer谆棱,但是timer又是非常耗資源的快压。所以我這里參考其他文章寫了一個timer的管理工具圆仔。主要就是對timer做一個全局的統(tǒng)一的管理。使用單例模式保證全局只有唯一的timer嗓节。這樣可以降低性能消耗方便管理荧缘。
代碼很簡單就兩個對象。
Task:當(dāng)前timer需要執(zhí)行任務(wù)的一個數(shù)據(jù)結(jié)構(gòu)
Timermanger: timer 的生成與方法的執(zhí)行拦宣,全局唯一的管理截粗。

struct Task {
    var taskId: String = ""
    var interval: Int
    var event: () -> ()
}

class TimerManger: NSObject {
    static let share = TimerManger()

    override private init() {
        super.init()
        RunLoop.main.add(self.timer, forMode: .common)
    }

    private var taskArr = [Task]()

    private lazy var timer: Timer = {
        var index = 0
        let timer = Timer.scheduledTimer(withTimeInterval: 1 / 60, repeats: true) { _ in
            if index == 59 {
                index = 0
            }
            for task in self.taskArr {
                if index % task.interval == 0 {
                    task.event()
                }
            }
            index += 1
        }
        return timer
    }()

    func runTask(task: Task) {
        for t in self.taskArr {
            if t.taskId == task.taskId {
                return
            }
        }
        self.taskArr.append(task)
    }

    func cancelTaskWithId(_ id: String) {
        for i in 0 ..< self.taskArr.count {
            if self.taskArr[i].taskId == id {
                self.taskArr.remove(at: i)
            }
        }
    }
}

使用也很簡單

let taks = Task.init(taskId: "aa", interval: 60) {
      print("執(zhí)行了")
 }
TimerManger.share.runTask(task: taks)

使用Task保存了當(dāng)前循環(huán)任務(wù)需要執(zhí)行的任務(wù)與循環(huán)的時間。這里的時間是1/60秒來作為基礎(chǔ)的鸵隧。所以如果要設(shè)置1秒執(zhí)行一次那么interval需要設(shè)置為60绸罗。當(dāng)然這個timerManger很簡單有很多局限。只能在main線程執(zhí)行豆瘫。并且默認是common模式珊蟀。如果不滿足大家需求也可以隨便改。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末外驱,一起剝皮案震驚了整個濱河市育灸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌昵宇,老刑警劉巖磅崭,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異瓦哎,居然都是意外死亡砸喻,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門蒋譬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來割岛,“玉大人,你說我怎么就攤上這事犯助⊙⑵幔” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵剂买,是天一觀的道長扑媚。 經(jīng)常有香客問我,道長雷恃,這世上最難降的妖魔是什么疆股? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮倒槐,結(jié)果婚禮上旬痹,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好两残,可當(dāng)我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布永毅。 她就那樣靜靜地躺著,像睡著了一般人弓。 火紅的嫁衣襯著肌膚如雪沼死。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天崔赌,我揣著相機與錄音意蛀,去河邊找鬼。 笑死健芭,一個胖子當(dāng)著我的面吹牛县钥,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播慈迈,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼若贮,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了痒留?” 一聲冷哼從身側(cè)響起谴麦,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎伸头,沒想到半個月后匾效,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡熊锭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年弧轧,在試婚紗的時候發(fā)現(xiàn)自己被綠了雪侥。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片碗殷。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖速缨,靈堂內(nèi)的尸體忽然破棺而出锌妻,到底是詐尸還是另有隱情,我是刑警寧澤旬牲,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布仿粹,位于F島的核電站,受9級特大地震影響原茅,放射性物質(zhì)發(fā)生泄漏吭历。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一擂橘、第九天 我趴在偏房一處隱蔽的房頂上張望晌区。 院中可真熱鬧,春花似錦、人聲如沸朗若。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽哭懈。三九已至灾馒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間遣总,已是汗流浹背睬罗。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留彤避,地道東北人傅物。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像琉预,于是被迫代替她去往敵國和親董饰。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容