RXSwift小进阶

2019-10-22 15:25:02 浏览数 (1)

RxSwift概念系列入门

上一篇我们整体预览了一下RxSwift的魅力这一讲我们接着详细拆分各个细节性的东西

Single

在Rx系列中所有的数据都是以信号的形式按照如流水线的实行从前往后行进,我们可以手动创建信号,然后发送给订阅的的人

代码语言:javascript复制
 let aSingle =   Single<String>.create { ( subscribe:(SingleEvent<String>) -> Void) -> Disposable in
            subscribe(.success("A"))
            return Disposables.create()
        }
     aSingle.subscribe(onSuccess: { (value) in
            
        })

我们创建一个信号(此时是冷信号,需要订阅才能变为热信号 ),然后通过订阅即可接受到信号携带的数据

那么我们看看携带信号是个什么东东的形式?

代码语言:javascript复制
public enum SingleEvent<Element> {
    /// One and only sequence element is produced. (underlying observable sequence emits: `.next(Element)`, `.completed`)
    case success(Element)
    
    /// Sequence terminated with an error. (underlying observable sequence emits: `.error(Error)`)
    case error(Swift.Error)
}

通过简单的实例与定义我们看出得到的信号事件是个enum可以有success、error两种形态。下面我们结合网络进行一综合的实践

通过Single实现一个基于网络的信号事件

代码语言:javascript复制
func aSingle(urlStr : String)->Single<Data?>{
    
     let si =   Single<Data?>.create {  single in
         let task =    URLSession.shared.dataTask(with: URL.init(string: urlStr)!) { (data, response, error) in
                if error != nil {
                    single(.error(error!))
                }else{
                    single(.success(data))
                }
            }
            task.resume()
            
            return Disposables.create {
                task.cancel()
            }
        }
        return si
    }

我们创建了一个返回Single<Data?>的信号,内部通过URLSession实现数据的网络请求,之后咱们通过订阅的形式获取信号事件

代码语言:javascript复制
   //第一种 订阅原始的信号
    result.subscribe { (event:SingleEvent<Data?>) in
            switch event {
            case .error(let e):
                print(e)
                break
            case .success(let data):
                print(String(data: data!, encoding: .utf8))
            break
            }
        }
        //第二种 订阅基于内部处理处理过的信号
        result.subscribeOn(MainScheduler.instance).subscribe(onSuccess: { (data) in
            
        }) { (error) in
            
        }.dispose()
        

通过订阅我们可以获取到信号事件,而系统为我们提供了两种常用的方式类实现信号事件的订阅

Subject

代码语言:javascript复制
 let subject = PublishSubject<String>()
        subject.subscribeOn(MainScheduler.instance).subscribe { (event) in
          print(event)
        }
        subject.onNext("send a Event")

典型的使用就是Hook文本输入事件响应的使用

代码语言:javascript复制
    var textInput = PublishSubject<String?>()
    @IBOutlet weak var textField: UITextField!
    override func viewDidLoad() {
        super.viewDidLoad()
  result.bind(to: textInput)
            .disposed(by: dispose)
            
               textInput.distinctUntilChanged()
            .observeOn(MainScheduler.instance).subscribe{
                print($0)
        }
        
}

MulticastConnection

当我们的信号有多个订阅的时候,我们希望通过一次发送实现多个订阅者均可接受数据,那么这样的怎么完成?

在RXSwift中我们可以简单的将一个信号转化为一个入下的sequence的Observable

然后在这个sequence上进行订阅

代码语言:javascript复制
 let aSingle =   Single<String>.create { ( subscribe:(SingleEvent<String>) -> Void) -> Disposable in
            subscribe(.success("A"))
            return Disposables.create()
        }
   let connection =     aSingle.asObservable().publish()
        connection.bind { (vale) in
            
        }
        connection.subscribe { (event) in
            
        }
        connection.single().subscribe { (event) in
            
        }
        connection.connect()

需要注意的是必须要调用connect()才能实现信号事件的接受

RX信息量其实很多,函数式比较强,更加直观的可以店家查看原文,参考简书一网友的总结【总结的时分到位】

0 人点赞