• Rxswift(1)


    数据绑定

    在这里插入图片描述

    平常的写法

    let image: UIImage = UIImage(named: ...)
    imageView.image = image
    
    • 1
    • 2

    绑定的写法

    //可监听序列
    let image: Observable<UIImage> = ...
    //imageView.rx.image 观察者
    image.bind(to: imageView.rx.image)
    
    • 1
    • 2
    • 3
    • 4

    上面的同步机制就是 数据绑定

    核心

    在这里插入图片描述

    //这里是分开的写法
    
    // Observable
    let text = usernameOutlet.rx.text.orEmpty.asObservable()
    
    // Observable
    let passwordValid = text
        // Operator
        .map { $0.count >= minimalUsernameLength }
    
    // Observer
    let observer = passwordValidOutlet.rx.isHidden
    
    // Disposable
    let disposable = passwordValid
        // Scheduler 用于控制任务在那个线程队列运行
        .subscribeOn(MainScheduler.instance)
        .observeOn(MainScheduler.instance)
        .bind(to: observer)
    
    
    ...
    
    // 取消绑定,你可以在退出页面时取消绑定
    disposable.dispose()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    Observerable 可监听序列

    1. 如何创建,调用 Observable.create 方法,observer.onNext(0) 产生一个元素, observer.onCompleted() 元素全部产生。observer.onError(error!) 出错了,序列终止
    typealias JSON = Any
    
    let json: Observable<JSON> = Observable.create { (observer) -> Disposable in
    
        let task = URLSession.shared.dataTask(with: ...) { data, _, error in
    
            guard error == nil else {
                observer.onError(error!)
                return
            }
    
            guard let data = data,
                let jsonObject = try? JSONSerialization.jsonObject(with: data, options: .mutableLeaves)
                else {
                observer.onError(DataError.cantParseJSON)
                return
            }
    
            observer.onNext(jsonObject)
            observer.onCompleted()
        }
    
        task.resume()
      //Disposables.create { task.cancel() } 说明如果数据绑定被清除(订阅被取消)的话,就取消网络请求
        return Disposables.create { task.cancel() }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    public enum Event<Element> {
        case next(Element)
        case error(Swift.Error)
        case completed
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. 特征序列
      不共享附加作用
      • Single
        发出一个元素,或一个 error 事件
    
    • 1
    func getRepo(_ repo: String) -> Single<[String: Any]> {
    
        return Single<[String: Any]>.create { single in
            let url = URL(string: "https://api.github.com/repos/\(repo)")!
            let task = URLSession.shared.dataTask(with: url) {
                data, _, error in
    
                if let error = error {
                    single(.error(error))
                    return
                }
    
                guard let data = data,
                      let json = try? JSONSerialization.jsonObject(with: data, options: .mutableLeaves),
                      let result = json as? [String: Any] else {
                    single(.error(DataError.cantParseJSON))
                    return
                }
    
                single(.success(result))
            }
    
            task.resume()
    
            return Disposables.create { task.cancel() }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    - Completable
    - Maybe
    
    • 1
    • 2

    共享附加作用

    - Driver, 驱动UI
       Driver会回放事件给新的观察者, 所以观察点击事件的响应的时候, 用 Driver就不合适了,用signal
    - Signal   事件序列用singal
    - ControlEvent, 专门用于描述UI控件所产生的事件
    
    • 1
    • 2
    • 3
    • 4
  • 相关阅读:
    一维数组、内存理解图--学习JavaEE的day9
    多媒体内容理解在美图社区的应用实践
    Nodejs -- CORS的介绍及使用CORS解决Express请求跨域的问题
    零碎知识点
    tsf consul单独使用,可以在tsf部署不
    了解软件测试
    为什么说区块链的性能难以衡量?
    树莓派pico mpu6050 一阶互补滤波&四元数法 解算姿态角
    20. 有效的括号 --力扣 --JAVA
    NLP中的对抗训练(附PyTorch实现)
  • 原文地址:https://blog.csdn.net/fishycx/article/details/134434886