RAC,ReactiveSwift


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM