美文网首页
RxSwift-中介者模式

RxSwift-中介者模式

作者: Janek_m | 来源:发表于2019-08-11 19:44 被阅读0次

    函数响应编程&RxSwift核心逻辑 上
    函数响应编程&RxSwift核心逻辑 下
    待续...正在努力编写
    RxSwift-中介者模式
    RxSwift-KVO\内存管理

        // self -> lgTimer -> self 【强引用无法进行销毁】
        lgTimer = Timer.init(timeInterval: 1, target: self, selector: #selector(timerFire), userInfo: nil, repeats: true)
        @objc func timerFire(){
            print("timer fire")
        }
        //打破循环引用 - 中介者模式\block
        //打破循环引用执行 deinit
        deinit {
            lgTimer?.invalidate()
            lgTimer = nil
            print("\(self) 走了")
        }
    

    中介者 - map - MAP --- 【进行包装】
    1、你不愿意处理的事情交给中介者处理 --- 一些SDK封装常用的模式
    2、节省开发的不安全性...

    // VC 类
        let proxy: LGProxy = LGProxy()
    
        proxy.lg_scheduledTimer(timeInterval: 1, target: self, selector: #selector(timerFire), userInfo: nil, repeats: true)
    
        @objc func timerFire(){
            print("timer fire")
        }
    
        deinit {
            print("\(self) 走了")
        }
    
    // LGProxy 中介者类
    class LGProxy: NSObject {
    
        weak var target: NSObjectProtocol? // --- 弱引用weak
        var sel: Selector? // ---- 保存
        var lgTimer: Timer? = nil
        
        override init() {
            super.init()
        }
        
        func lg_scheduledTimer(timeInterval ti: TimeInterval, target aTarget: Any, selector aSelector: Selector, userInfo: Any?, repeats yesOrNo: Bool){
            
            // vc -> proxy -> target -weak-> self 
            
            self.lgTimer = Timer.init(timeInterval: ti, target: self, selector: aSelector, userInfo: userInfo, repeats: yesOrNo)
            RunLoop.current.add(self.lgTimer!, forMode: .common)
            
            self.target = aTarget as? NSObjectProtocol
            self.sel    = aSelector
            
            // 如果外界实现了--那么return
            
            guard self.target?.responds(to: self.sel) == true else{
                return
            }
            
            // proxy aSelector - 是不是释放
            //方法交换
            let method = class_getInstanceMethod(self.classForCoder, #selector(lgTimerFire))
            class_replaceMethod(self.classForCoder, self.sel!, method_getImplementation(method!), method_getTypeEncoding(method!))
            
        }
        
        //不断的进行实现它
        @objc fileprivate func lgTimerFire(){
            if self.target != nil{
                self.target!.perform(self.sel)
            }
            else{
                self.lgTimer?.invalidate()
                self.lgTimer = nil
            }
        }
        // 防一些坑
        // 消息转发 - Method - 重写此方法
        override func forwardingTarget(for aSelector: Selector!) -> Any? {
            if self.target?.responds(to: self.sel) == true {
                return self.target
            }
            else{
                print("没有实现selector奔溃==填坑")
                //可以处理防奔溃 。。。。【底层】
                
                return super.forwardingTarget(for: aSelector)
            }        
        }
        
        
        deinit {
            print("\(self) 走..你")
        }
        
        // 释放流程:优先走VC - method没有持有 - 中介者
    }
    

    相关文章

      网友评论

          本文标题:RxSwift-中介者模式

          本文链接:https://www.haomeiwen.com/subject/rfysjctx.html