一般 OOP 常见的一步,网络请求,获取数据,刷新 UI
网络请求,获取数据,是一步
刷新 UI,是第二步
的场景下,有用
去做一个网络请求,刷新界面。
这样的指令会有两条
NotificationCenter.default.rx.notification(.readNetRequest) .takeUntil(self.rx.deallocated) .subscribe(onNext: { [weak self] ( noti ) in guard let `self` = self else { return } self.doReadNetRequestAndDoRefreshUI() }).disposed(by: rx.disposeBag) 复制代码
去请求一次网络,订阅了的界面去刷新
比起用通知,网络请求少了一次。
NetMangerPublisher.f.outputStudy.subscribe(onNext: { (data) in self.doRefreshUI() }).disposed(by: rx.disposeBag) 复制代码
网络请求管理,由行为驱动,需要时请求数据,
改为数据驱动,数据更新,UI 更新。
UI 状态,总是和最新的数据保持一致。
这样方便的实现了数据共享
struct NetMangerPublisher { static var f = NetMangerPublisher() private let inputRead = BehaviorSubject<Bool>(value: true) private let inputWrite= PublishSubject<Bool>() var outputRead: Observable<[String: Any]?> var outputWrite: Observable<[String: Any]?> init(){ outputRead = inputStudy.asObservable().map({ (_) -> Bool in Global.hasLogined() }) .flatMapLatest { isRefreshing -> Observable<[String: Any]?> in guard isRefreshing else { return .empty() } return NetManager.standard.read() }.share(replay: 2, scope: SubjectLifetimeScope.forever) outputWrite = inputClock.asObservable().flatMapLatest{ (isRefreshing) -> Observable<[String: Any]?> in return NetManager.standard.write() }.share(replay: 4, scope: SubjectLifetimeScope.forever) } func doRead(){ inputRead.onNext(true) } func doWrite(){ inputWrite.onNext(true) } } 复制代码
BehaviorSubject ,可以设置默认值。因为需要一个初始界面,一个 viewDidLoad
内的网络请求。一个初始的状态
PublishSubject, 适合用户的操作。用户不操作,什么事都不发生。
let disposeBag = DisposeBag() Observable<String>.create { observer in observer.onNext("1") observer.onCompleted() return Disposables.create() } .subscribe( onNext: { print($0) }, onError: { print($0) }, onCompleted: { print("Completed") }, onDisposed: { print("Disposed") } ) .disposed(by: disposeBag) 复制代码
create
方法定义了,发送给订阅者的所有事件
create
方法,有一个尾随闭包,里面有一个 AnyObserver
的泛型,充当观察者 observer
该 observer 可以添加事件,形成事件序列,发送给订阅者
func readData() -> Observable<[]>{ return Observable<[String: Any]?>.create{ (observer) -> Disposable in self.readDataTask?.cancel() self.readDataTask = Base.netHud.request(.readData){ (result) in // ...... observer.onNext(dat) observer.onCompleted() } return Disposables.create{ self.readDataTask?.cancel() } } } 复制代码