RxSwift 调度者(三)

2019-08-29  本文已影响0人  iChuck

RxSwift 调度者(三)

补充 publish

let ob = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
        
let ob2 = ob.publish()
    
ob2.subscribe(onNext: {  print("第一次:\($0)") })
    
ob2.connect()
    
ob2.subscribe(onNext: {  print("第二次:\($0)") })

UI 事件一定在主线程

DispatchQueue.global().async {
            
    self.button.rx.tap
        .subscribe(onNext: { _ in
          print("\(Thread.current)")
        })
}

PublishSubject

BehaviorSubject

BehaviorRelay 可以直接设置和拿到值

let br = BehaviorRelay<Int>(value: 100)
        
br.accept(1000)
    
br.value

总结:一般我们在页面传值的时候用 subject 比较多,序列的传递

Dispose

KVO

RxSwift 内存管理

post_install do |installer|
  installer.pods_project.targets.each do |target|
    if target.name == 'RxSwift'
      target.build_configurations.each do |config|
        if config.name == 'Debug'
          config.build_settings['OTHER_SWIFT_FLAGS'] ||= ['-D', 'TRACE_RESOURCES']
        end
      end
    end
  end
end
override func viewWillAppear(_ animated: Bool) {
   super.viewWillAppear(animated)
       
    print("计数viewWillAppear:\(RxSwift.Resources.total)")
}
        
override func viewWillDisappear(_ animated: Bool) {
    super.viewWillAppear(animated)
    print("计数viewWillDisappear:\(RxSwift.Resources.total)")

}

中介者模式

class XCTimer: NSObject {
    
    weak var target: NSObjectProtocol?
    var sel: Selector?
    var xcTimer: Timer? = nil
    
    
    override init() {
        super.init()
    }
    
    func xc_scheuledTimer(timeInterval ti: TimeInterval, target aTarget: Any, selector aSelector: Selector, userInfo: Any? = nil, repeats: Bool) {
        
        self.xcTimer = Timer.init(timeInterval: ti, target: aTarget, selector: aSelector, userInfo: userInfo, repeats: repeats)
        RunLoop.current.add(self.xcTimer!, forMode: .common)
        
        self.target = aTarget as? NSObjectProtocol
        self.sel = aSelector
        
        
        guard self.target?.responds(to: self.sel) == true else {
            return
        }
        
        let method = class_getInstanceMethod(self.classForCoder, #selector(timerAction))
        
        class_replaceMethod(self.classForCoder, self.sel!, method_getImplementation(method!), method_getTypeEncoding(method!))
    }
    
    @objc
    fileprivate func timerAction() {
        if self.target != nil {
            self.target!.perform(self.sel)
        } else {
            self.xcTimer?.invalidate()
            self.xcTimer = nil
        }
    }
    
    override func forwardingTarget(for aSelector: Selector!) -> Any? {
        if self.target?.responds(to: self.sel) == true {
            return self.target
        }
        else {
            // 容错处理~ 可以通过 Runtime 来创建没实现的 Selector
//            class_addMethod(self.classForCoder, aSelector, imp_, <#T##types: UnsafePointer<Int8>?##UnsafePointer<Int8>?#>)
            
            return super.forwardingTarget(for: aSelector)
        }
    }
    
}

let time = XCTimer()
time.xc_scheuledTimer(timeInterval: 1, target: self, selector: #selector(time), repeats: true)

func time() {
}
上一篇 下一篇

猜你喜欢

热点阅读