1.創建信號
// 1.通過信號發生器創建(冷信號) let producer = SignalProducer<String, NoError>.init { (observer, _) in print("新的訂閱,啟動操作") observer.send(value: "Hello") observer.send(value: "World") } let subscriber1 = Observer<String, NoError>(value: { print("觀察者1接收到值 \($0)") }) let subscriber2 = Observer<String, NoError>(value: { print("觀察者2接收到值 \($0)") }) print("觀察者1訂閱信號發生器") producer.start(subscriber1) print("觀察者2訂閱信號發生器") producer.start(subscriber2) //注意:發生器將再次啟動工作 // 2.通過管道創建(熱信號) let (signalA, observerA) = Signal<String, NoError>.pipe() let (signalB, observerB) = Signal<String, NoError>.pipe() Signal.combineLatest(signalA, signalB).observeValues { (value) in print( "收到的值\(value.0) + \(value.1)") } observerA.send(value: "1") //注意:如果加這個就是,發了一次信號就不能再發了 observerA.sendCompleted() observerB.send(value: "2") observerB.sendCompleted() //3.創建空信號 let emptySignal = Signal<Any, NoError>.empty emptySignal.observe { (value) in }
2.基本控件用法
//MARK:通知 private func noti() { NotificationCenter.default.reactive.notifications(forName: Notification.Name(rawValue: "UIKeyboardWillShowNotification"), object: nil).observeValues { (value) in } NotificationCenter.default.post(name: Notification.Name(rawValue: "name"), object: self) } //MARK:KVO private func kvoWithRac() { view.reactive.values(forKeyPath: "bounds").start { [weak self](rect) in print(self?.view ?? "") print(rect) } } //MARK:按鈕點擊 private func btnWithRAC() { //1.點擊 btn.tag = 10 btn.isEnabled = true btn.reactive.controlEvents(.touchUpInside).observeValues { (btn) in print("點擊了按鈕,顏色\(btn.tag)") } } //textField textField.reactive.continuousTextValues.observeValues { (value) in }
3.過濾 filter
//filter作用:過濾 當text>5才會輸出 textField.reactive.continuousTextValues.filter { (text) -> Bool in return (text?.characters.count)! > 5 }.observe({ text in print(text) })
4.轉換 map
//每一次map接收到的Value事件,它就會運行closure,以closure的返回值作為Value事件發送出去。上面的代碼中,我們的text的值映射成text的字符數 textField.reactive.continuousTextValues.map { (text) -> Int in return (text?.characters.count)! }.filter { (length) -> Bool in return length > 5 }.observe { (length) in print(length) } //(改變屬性)使用map與observeValues結合改變屬性 textField.reactive.continuousTextValues .map { (text) -> Int in return (text?.characters.count)! } .map { (length) -> UIColor in return length > 5 ? UIColor.red : UIColor.yellow } .observeValues { (backgroundColor) in self.textField.backgroundColor = backgroundColor }
5.兩個信號結合使用 <~
//1.
let nameSign = textField.reactive.continuousTextValues.map { (text) -> Int in return (text?.characters.count)! } let passSign = passwordtextField.reactive.continuousTextValues.map { (text) -> Int in return (text?.characters.count)! } btn.reactive.isEnabled <~ Signal.combineLatest(nameSign, passSign).map({(namelength : Int, passlength : Int) -> Bool in return namelength >= 1 && passlength > 6 })
//2.
Signal.combineLatest(nameSign,passSign).observeValues { (namelength : Int, passlength : Int) in
}
6.Scheduler(調度器)延時加載
// 主線程上延時0.3秒調用 QueueScheduler.main.schedule(after: Date.init(timeIntervalSinceNow: 0.3)) { print("主線程調用") } QueueScheduler.init().schedule(after: Date.init(timeIntervalSinceNow: 0.3)){ print("子線程調用") }
7.迭代器
// 數組的迭代器 let array:[String] = ["name","name2"] var arrayIterator = array.makeIterator() while let temp = arrayIterator.next() { print(temp) } // swift 系統自帶的遍歷 array.forEach { (value) in print(value) } // 字典的迭代器 let dict:[String: String] = ["key":"name", "key1":"name1"] var dictIterator = dict.makeIterator() while let temp = dictIterator.next() { print(temp) } // swift 系統自帶的遍歷 dict.forEach { (key, value) in print("\(key) + \(value)") }
8.信號聯合
func testZip() { let (signalA, observerA) = Signal<Any, NoError>.pipe() let (signalB, observerB) = Signal<String, NoError>.pipe() Signal.zip(signalA, signalB).observeValues { (value) in print(value) } signalA.zip(with: signalB).observeValues { (value) in } observerA.send(value: "1") observerA.sendCompleted() observerB.send(value: "2") observerB.sendCompleted() }
9.代替delegate
1. import ReactiveCocoa import ReactiveSwift import Result 2.let (signalTap , observerTap) = Signal<Any, NoError>.pipe() observerTap.send(value: tap) 自定義個view class LyContentView: UIView { let (signalTap , observerTap) = Signal<Any, NoError>.pipe() override init(frame: CGRect) { super.init(frame: frame) setUI() } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } } extension LyContentView { fileprivate func setUI() { backgroundColor = UIColor.yellow let tap = UITapGestureRecognizer(target: self, action: #selector(self.tapClick(_:))) addGestureRecognizer(tap) } //使用RAC,替代delegate,閉包 @objc fileprivate func tapClick(_ tap : UITapGestureRecognizer) { observerTap.send(value: tap) } } 3.控制器中監聽 contentView.signalTap.observeValues { (value) in print("點擊了view") }
Demo:https://github.com/zhangjie579/LyReactiveSwiftDemo