美文网首页
RxSwift_操作符_using

RxSwift_操作符_using

作者: MR_詹 | 来源:发表于2021-03-19 11:00 被阅读0次
# 源码

public static func using<Resource>(
_ resourceFactory: @escaping () throws -> Resource, 
observableFactory: @escaping (Resource) throws -> RxSwift.Observable<Self.Element>) 
-> RxSwift.Observable<Self.Element> 
where Resource : RxSwift.Disposable

using的作用,官方注释:
构造一个依赖于资源对象的可观察序列,资源对象的生命周期与产生的可观察序列的生命周期绑定

根据方法的结构做简单的解释:
(1)using操作符目的创建一个Observable
(2)using创建的Observable是通过observableFactory闭合函数,而且using创建的Observable序列生命周期依赖于observableFactory创建的函数(就是同一个可观察队列)
(3)resourceFactory闭包函数返回的是RxSwift.Disposable类型的值,通常是在这个闭包函数中订阅另外一个可观察序列并将其Disposable的返回值return,这样才能让这个序列的生命周期依赖于observableFactory创建的生命周期

Demo案例

class NetworkController: UIViewController {
    
    let bag = DisposeBag()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = .white

        //一个无限序列(每隔0.1秒创建一个序列数 )
       let infiniteInterval$ = Observable<Int>
        .interval(.milliseconds(100), scheduler: MainScheduler.instance)
           .do(
               onNext: { print("infinite$: \($0)") },
               onSubscribe: { print("开始订阅 infinite$")},
               onDispose: { print("销毁 infinite$")}
       )
        
       //一个有限序列(每隔0.5秒创建一个序列数,共创建三个 )
       let limited$ = Observable<Int>
        .interval(.milliseconds(200), scheduler: MainScheduler.instance)
           .take(2)
           .do(
               onNext: { print("limited$: \($0)") },
               onSubscribe: { print("开始订阅 limited$")},
               onDispose: { print("销毁 limited$")}
       )
        
       //使用using操作符创建序列
       let o: Observable<Int> = Observable.using({ () -> AnyDisposable in
           return AnyDisposable(infiniteInterval$.subscribe())
       }, observableFactory: { _ in return limited$ }
       )
        
        o.subscribe(onNext:{
            print("o ===",$0)
        }).disposed(by: bag)
    }
}


class AnyDisposable: Disposable {
    let _dispose: () -> Void
     
    init(_ disposable: Disposable) {
        _dispose = disposable.dispose
    }
     
    func dispose() {
        _dispose()
    }
}

/// 打印结果:
/// 开始订阅 infinite$
/// 开始订阅 limited$
/// infinite$: 0
/// infinite$: 1
/// limited$: 0
/// o === 0
/// infinite$: 2
/// infinite$: 3
/// limited$: 1
/// o === 1
/// 销毁 limited$
/// 销毁 infinite$

项目运用典型的案例就是:RxSwift官方DemoActivityIndicator文件的使用
提示:RxSwift的学习最好还是参考官方提供的Demo,写法是最优雅的

相关文章

  • RxSwift_操作符_using

    using的作用,官方注释:构造一个依赖于资源对象的可观察序列,资源对象的生命周期与产生的可观察序列的生命周期绑定...

  • RXSwift_操作符

    Subject创建订阅Source PublishSubject 最普通的subject,对它订阅的订阅者只会收到...

  • RxSwift_操作符_withLatestFrom

    withLatestFrom 操作符将两个 Observables 中最新的元素通过一个函数组合起来,然后将这个组...

  • RxSwift_操作符_share(replay:scope:)

    share(replay:scope:) 作用:解决有多个订阅者的情况下,避免事件转换操作符(比如:map、fla...

  • RxSwift_操作符_map、flatmap、flatMapL

    map操作符将源Observable的每个元素,通过提供的方法转换,然后返回含有转换后元素的Observable ...

  • C#比较器

    C#类中显示与隐匿转换操作符同时只能实现一个 // 实现可比较接口using System;class Salar...

  • RxSwift_核心原理

    基本流程 创建序列 订阅序列 发送信号 带着问题去思考底层的实现 涉及到的几个主要的类的继承关系 流程分析 源码分...

  • sqlsugar where条件

    using Dapper; using SqlSugar; using SyntacticSugar; using...

  • 入门篇

    using Model; using Newtonsoft.Json; using SqlSugar; using...

  • WavUtility

    using UnityEngine;using System.Text;using System.IO;using...

网友评论

      本文标题:RxSwift_操作符_using

      本文链接:https://www.haomeiwen.com/subject/tjcvcltx.html