学习RxSwift(第1部分)

如今Rx蓬勃发展,我认为如果每个开发人员都使用RxSwift会更好

Rx =反应式编程,这是一个与数据流变化传播有关的声明式编程范例,例如,在命令式编程中,将a = b+c设置a = b+ca的结果赋给a b+c 然后是b的值 c 可以更改而不会影响a的值,但是在反应式编程中,a的值 只要b的值自动更新 c 更改,而程序不必重新执行语句a:=b+c 确定a的当前赋值 维基百科

ReactiveX是来自以下方面的最佳创意的组合
观察者模式,迭代器模式和功能编程。

ReactiveX不仅仅是一个API,它是编程的想法和突破。 它启发了其他几种API,框架,甚至是编程语言。

在ReactiveX中,观察者订阅了一个Observable。 然后,该观察者对可观察对象发出的任何项目或项目序列做出反应。 这种模式有助于并发操作,因为它在等待Observable发出对象时不需要阻塞,而是以观察者的形式创建了一个哨兵,随时准备在Observable以后的任何时间做出适当的反应。

在ReactiveX中,许多指令可能会并行执行,并且随后会捕获其结果,您以“可观察”的形式定义了一种用于检索和转换数据的机制,然后为它订阅了一个观察者,在此之前,当观察员站岗时,定义好的机制便开始行动起来,以随时捕获并响应其排放。

这种方法的优点是,当您有一堆彼此不依赖的任务时,可以同时启动所有任务,而不必等每个任务都完成才开始下一个任务-这样,您的整个完成任务捆绑包所需的时间与捆绑包中最长的任务一样长。

热点观察

在创建项目后立即发出项目,因此以后订阅该Observable的任何观察者都可以开始观察中间位置的序列。

冷观测

等到观察者订阅它之后才开始发射项目,因此可以保证这样的观察者从一开始就可以看到整个序列。

RxSwift功能强大且功能强大,可节省大量开发人员的生命和精力,可用于:

1-绑定

  Observable.combineLatest(firstName.rx.text,lastName.rx.text){$ 0 +“” + $ 1} 
.map {“问候语,\($ 0)”}
.bind(发送至:greetingLabel.rx.text)

2-代表

而不是进行乏味且无表情的操作:

 公共功能scrollViewDidScroll(scrollView:UIScrollView){[弱自我] 
self?.leftPositionConstraint.constant = scrollView.contentOffset.x
}

…写

  self.resultsTableView 
.rx.contentOffset
.map {$ 0.x}
.bind(发送至:self.leftPositionConstraint.rx.constant)

3- KVO

代替:

  -(void)observeValueForKeyPath:(NSString *)keyPath 
ofObject:(id)对象
更改:(NSDictionary *)更改
上下文:(void *)context

使用rx.observerx.observeWeakly

这是如何使用它们:

  view.rx.observe(CGRect.self,“框架”) 
.subscribe(onNext:{
打印(“获得新框架\(框架)”)
})
.disposed(作者:disposeBag)

要么

  someSuspiciousViewController 
.rx.observeWeakly(Bool.self,“行为正常”)
.subscribe(onNext:{behavingOk in
打印(“猫可以发出呼pur声吗?\(行为正常”))
})
.disposed(作者:disposeBag)

4-通知

而不是使用:

  @available(iOS 4.0,*) 
公共函数addObserverForName(名称:字符串?,对象obj:AnyObject ?,队列:NSOperationQueue ?, usingBlock块:(NSNotification)-> Void)-> NSObjectProtocol

… 写吧

  NotificationCenter.default 
.rx.notification(NSNotification.Name.UITextViewTextDidBeginEditing,对象:myTextView)
.map {/ *使用数据做某事* /}

5-异步自动完成搜索框

  searchTextField.rx.text 
.throttle(0.3,Scheduler:MainScheduler.instance)
.distinctUntilChanged()
.flatMapLatest {
API.getSearchResults(query)
.retry(3)
.startWith([])//清除新搜索字词的结果
.catchErrorJustReturn([])
}
.subscribe(onNext:{结果为
//绑定到ui
})
.disposed(作者:disposeBag)

6成分处置

当您需要在单元格中下载图像时,则当该单元格可见时,请求将发送以下载图像,因此如果用户快速刷卡,则可能会触发和取消许多请求。可能会限制并发图像操作的数量,RxSwift可以轻松地处理此操作。

 让imageSubscription = imageURLs 
.throttle(0.2,调度器:MainScheduler.instance)
.flatMapLatest {imageURL in
API.fetchImage(imageURL)
}
.observeOn(operationScheduler)
.map {imageData in
返回decodeAndBlurImage(imageData)
}
.observeOn(MainScheduler.instance)
.subscribe(onNext:{
imageView.image =模糊图像
})
.disposed(作者:reuseDisposeBag)

7-汇总网络请求

当您需要触发两个请求并在两个请求都完成时汇总结果时,RxSwift可以通过很棒的方式处理此问题

 让userRequest:Observable  = API.getUser(“ me”) 
让好友请求:Observable = API.getFriends(“ me”)

Observable.zip(userRequest,friendsRequest){用户,
返回(用户,朋友)
}
.subscribe(onNext:{用户,
//将它们绑定到用户界面
})
.disposed(作者:disposeBag)

8-MVVM –单向数据流

9-易于集成

  • 可组合 –因为Rx是组合的昵称
  • 可重用 –因为它是可组合的
  • 声明式 –因为定义是不可变的,只有数据会更改
  • 易于理解和简洁 –提高抽象水平并消除瞬态
  • 稳定 –因为Rx代码已经过全面的单元测试
  • 状态更少 -因为您将应用程序建模为单向数据流
  • 无泄漏 –因为资源管理容易

在本文中,我们讨论了RxSwift的含义,它如何依赖于Observer设计模式,为什么要使用它以及如何节省大量时间。
如何创建RxSwift可观察对象(第2部分)

RxSwift

反应式编程

反应性X