Timer封裝

這里運(yùn)用中介者模式的思想,封裝一個(gè)Timer,簡化其他對象與timer的交互過程
創(chuàng)建中介者類RTimer

 var timer: Timer?
    weak var target: NSObjectProtocol?
    var sel: Selector?
    
    func scheduled(timeInterval ti: TimeInterval, target aTarget: Any, selector aSelector: Selector, userInfo: Any?, repeats yesOrNo: Bool) {
        
        self.target = aTarget as? NSObjectProtocol
        self.sel = aSelector
        
        timer = Timer(timeInterval: ti, target: self, selector: aSelector, userInfo: userInfo, repeats: yesOrNo)
        RunLoop.current.add(timer!, forMode: .common)
        
        guard self.target?.responds(to: self.sel!) == true else {
            return
        }
       //交換方法
        let method = class_getInstanceMethod(self.classForCoder, #selector(fire))
        class_replaceMethod(self.classForCoder, self.sel!, method_getImplementation(method!), method_getTypeEncoding(method!))
    }

     @objc func fire() {
        //執(zhí)行target的sel方法,如果target被釋放,則銷毀timer
        if self.target?.perform(self.sel!) == nil {
            timer?.invalidate()
        }
    }

timer的使用

//VC:
  rTimer.scheduled(timeInterval: 1, target: self, selector: #selector(timerFire), userInfo: nil, repeats: true)

rTimer會(huì)隨著當(dāng)前VC對象的釋放自動(dòng)銷毀,不會(huì)存在循環(huán)引用問題,也不用手動(dòng)調(diào)用timer.invalidate()

補(bǔ)充
如果VC沒有實(shí)現(xiàn)aSelector方法,程序就會(huì)直接崩潰,我們可以重寫RTimer的forwardingTarget方法,利用消息轉(zhuǎn)發(fā)機(jī)制在崩潰前輸出一些信息

 override func forwardingTarget(for aSelector: Selector!) -> Any? {
        print(aSelector)
        if target?.responds(to: self.sel!) == true {
            return target
        }
        print("\(target)沒有實(shí)現(xiàn)方法:\(NSStringFromSelector(aSelector))")
        return super.forwardingTarget(for: aSelector)
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,136評(píng)論 1 32
  • 一、深復(fù)制和淺復(fù)制的區(qū)別? 1、淺復(fù)制:只是復(fù)制了指向?qū)ο蟮闹羔槪磧蓚€(gè)指針指向同一塊內(nèi)存單元!而不復(fù)制指向?qū)ο蟮?..
    iOS_Alex閱讀 1,423評(píng)論 1 27
  • 1.OC里用到集合類是什么? 基本類型為:NSArray,NSSet以及NSDictionary 可變類型為:NS...
    輕皺眉頭淺憂思閱讀 1,393評(píng)論 0 3
  • 師父留作業(yè):記錄只觀察不評(píng)價(jià)的一天。虔誠點(diǎn)頭嗯嗯。心里畫魂,這得咋過呢?不琢磨了,起床。 睜開眼睛,第...
    悠悠wyk閱讀 207評(píng)論 0 0
  • 真正的學(xué)習(xí),是將別人的東西變成自己的東西,在生活上運(yùn)用自如。就像子木說的,百無一用是書生,學(xué)以致用是關(guān)鍵。 2天的...
    家庭教育郝老師閱讀 734評(píng)論 4 0