Timer封装

这里运用中介者模式的思想,封装一个Timer,简化其他对象与timer的交互过程
创建中介者类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() {
        //执行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会随着当前VC对象的释放自动销毁,不会存在循环引用问题,也不用手动调用timer.invalidate()

补充
如果VC没有实现aSelector方法,程序就会直接崩溃,我们可以重写RTimer的forwardingTarget方法,利用消息转发机制在崩溃前输出一些信息

 override func forwardingTarget(for aSelector: Selector!) -> Any? {
        print(aSelector)
        if target?.responds(to: self.sel!) == true {
            return target
        }
        print("\(target)没有实现方法:\(NSStringFromSelector(aSelector))")
        return super.forwardingTarget(for: aSelector)
    }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,142评论 1 32
  • 一、深复制和浅复制的区别? 1、浅复制:只是复制了指向对象的指针,即两个指针指向同一块内存单元!而不复制指向对象的...
    iOS_Alex阅读 1,424评论 1 27
  • 1.OC里用到集合类是什么? 基本类型为:NSArray,NSSet以及NSDictionary 可变类型为:NS...
    轻皱眉头浅忧思阅读 1,394评论 0 3
  • 师父留作业:记录只观察不评价的一天。虔诚点头嗯嗯。心里画魂,这得咋过呢?不琢磨了,起床。 睁开眼睛,第...
    悠悠wyk阅读 208评论 0 0
  • 真正的学习,是将别人的东西变成自己的东西,在生活上运用自如。就像子木说的,百无一用是书生,学以致用是关键。 2天的...
    家庭教育郝老师阅读 740评论 4 0