前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >RXSwift小进阶

RXSwift小进阶

作者头像
大话swift
发布2019-10-22 15:25:02
7800
发布2019-10-22 15:25:02
举报
文章被收录于专栏:大话swift大话swift

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-10-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大话swift 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • MulticastConnection
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档