前段時間一直在玩
RxSwift
洽胶,現(xiàn)在記錄一下這個牛逼罐呼,讓人欲罷不能的框架.RxSwift
看我就夠了
RxSwift 寶圖鎮(zhèn)博,咔咔點贊~~~~
Rxswift
-
RxSwift 深入淺出(一)RxSwift初探
-
RxSwift 深入淺出(二)高階函數(shù)
-
RxSwift 深入淺出(三)Subject
-
RxSwift 深入淺出(四)控件應(yīng)用
-
RxSwift 深入淺出(五)tableView應(yīng)用
-
RxSwift 深入淺出(六)RxDataSources
-
RxSwift 深入淺出(七)網(wǎng)絡(luò)封裝
-
RxSwift 深入淺出(八)開發(fā)總結(jié)
RxSwift
現(xiàn)在RxSwift
的的成績非常不錯,一看就知道是大虐缶框架
start
ReactiveX這個家族非常牛逼奉狈,寫了很多框架:
.....
今天我們就來看看RxSwift
RxSwift
的導(dǎo)入和編譯自行百度鳖昌,
import RxSwift
import RxCocoa
class ViewController: UIViewController{
lazy var tableView: UITableView = UITableView()
let reuserId:String = "cell"http://重用標(biāo)識
let infoViewModel: InfoViewModel = InfoViewModel()//數(shù)據(jù)viewmodel
//DisposeBag:作用是 Rx 在視圖控制器或者其持有者將要銷毀的時候备畦,自動釋法掉綁定在它上面的資源。它是通過類似“訂閱處置機制”方式實現(xiàn)(類似于 NotificationCenter 的 removeObserver)许昨。
let disposeBag = DisposeBag()
override func viewDidLoad() {
super.viewDidLoad()
setupUI()
//rx.items(cellIdentifier:):這是 Rx 基于 cellForRowAt 數(shù)據(jù)源方法的一個封裝懂盐。傳統(tǒng)方式中我們還要有個 numberOfRowsInSection 方法,使用 Rx 后就不再需要了(Rx 已經(jīng)幫我們完成了相關(guān)工作)糕档。
infoViewModel.infoArray.bind(to: tableView.rx.items(cellIdentifier: reuserId)){
row,model,cell in
cell.textLabel?.text = "\(model.name) age == \(model.age) row = \(row)"
}.disposed(by: disposeBag)
//rx.modelSelected: 這是 Rx 基于 UITableView委托回調(diào)方法 didSelectRowAt 的一個封裝允粤。
tableView.rx.modelSelected(InfoModel.self).subscribe(onNext: { (model) in
print("點擊了 \(model.name) age==\(model.age)")
}).disposed(by: disposeBag)
}
}
//MARK: 設(shè)置UI相關(guān)
extension ViewController{
func setupUI(){
view.addSubview(tableView)
tableView.frame = view.bounds
tableView.backgroundColor = UIColor.white
tableView .register(UITableViewCell.self, forCellReuseIdentifier: reuserId)
}
}
//MARK: model
struct InfoModel {
let name:String //名字
let age:Int //年紀(jì)
init(name:String,age:Int) {
self.name = name
self.age = age
}
}
//MARK: 方便輸出打印
extension InfoModel:CustomStringConvertible{
var description:String{
return "name==\(name),age==\(age)"
}
}
struct InfoViewModel {
//MARK: 模擬假數(shù)據(jù)
let infoArray = Observable.just([
InfoModel(name: "Cooci", age: 19),
InfoModel(name: "CC", age: 18),
InfoModel(name: "James", age: 17),
InfoModel(name: "Gavin", age: 16),
InfoModel(name: "Dean", age: 15),
])
}
看了上面的代碼是不是感覺賊爽,代碼量大大精簡翼岁,思路更加清晰类垫,簡直完美,優(yōu)秀琅坡,還有~誰
import UIKit
import RxSwift
import RxCocoa
class ViewController: UIViewController {
let disposeB = DisposeBag()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
//通過指定的方法實現(xiàn)來自定義一個被觀察的序列悉患。
//訂閱創(chuàng)建
let myOb = Observable<Any>.create { (observ) -> Disposable in
observ.onNext("cooci")
observ.onCompleted()
return Disposables.create()
}
//訂閱事件
myOb.subscribe { (even) in
print(even)
}.disposed(by: disposeB)//銷毀
//各種觀察者序列產(chǎn)生方式
//該方法通過傳入一個默認值來初始化。
Observable.just("just")
.subscribe { (event) in
print(event)
}
.disposed(by: disposeB)
//該方法可以接受可變數(shù)量的參數(shù)(必需要是同類型的)
Observable.of("o","f","of").subscribe { (event) in
print(event)
}.disposed(by: disposeB)
//該方法需要一個數(shù)組參數(shù)榆俺。
Observable.from(["f","r","o","m"]).subscribe { (event) in
print(event)
}.disposed(by: disposeB)
//該方法創(chuàng)建一個永遠不會發(fā)出 Event(也不會終止)的 Observable 序列售躁。
Observable<Int>.never().subscribe { (event) in
print(event)
}.disposed(by: disposeB)
//該方法創(chuàng)建一個空內(nèi)容的 Observable 序列坞淮。 //會打印complete
Observable<Int>.empty().subscribe { (event) in
print(event)
}.disposed(by: disposeB)
//該方法創(chuàng)建一個不做任何操作,而是直接發(fā)送一個錯誤的 Observable 序列陪捷。
let myError = MyError.A
// print(myError.errorType)
Observable<Int>.error(myError).subscribe { (event) in
print(event)
}.disposed(by: disposeB)
//該方法通過指定起始和結(jié)束數(shù)值回窘,創(chuàng)建一個以這個范圍內(nèi)所有值作為初始值的Observable序列。
Observable.range(start: 1, count: 6).subscribe { (event) in
print(event)
}.disposed(by: disposeB)
//該方法創(chuàng)建一個可以無限發(fā)出給定元素的 Event的 Observable 序列(永不終止)市袖。
// Observable.repeatElement("Cooci").subscribe { (event) in
// print(event)
// }.disposed(by: disposeB)
//該方法創(chuàng)建一個只有當(dāng)提供的所有的判斷條件都為 true 的時候啡直,才會給出動作的 Observable 序列。
//第一個參數(shù):初始化的數(shù)值 第二個 條件 第三也是一個條件 0 + 2 <= 10 依次循環(huán)下去,iterate:重復(fù)執(zhí)行
Observable.generate(initialState: 0, condition: {$0<=10}, iterate: {$0+2}).subscribe { (event) in
print(event)
}.disposed(by: disposeB)
//上面和下面的效果一樣
Observable.of(0,2,4,6,8,10).subscribe { (event) in
print(event)
}.disposed(by: disposeB)
//該個方法相當(dāng)于是創(chuàng)建一個 Observable 工廠苍碟,通過傳入一個 block 來執(zhí)行延遲 Observable序列創(chuàng)建的行為酒觅,而這個 block 里就是真正的實例化序列對象的地方。
var isOdd = true
let factory: Observable<Int> = Observable.deferred { () -> Observable<Int> in
isOdd = !isOdd
if isOdd{
return Observable.of(0,2,4,6,8)
}else{
return Observable.of(1,3,5,7,9)
}
}
factory.subscribe { (event) in
print("\(isOdd)",event)
}.disposed(by: disposeB)
factory.subscribe { (event) in
print("\(isOdd)",event)
}.disposed(by: disposeB)
//這個方法創(chuàng)建的 Observable 序列每隔一段設(shè)定的時間微峰,會發(fā)出一個索引數(shù)的元素舷丹。而且它會一直發(fā)送下去。
// Observable<Int>.interval(1, scheduler: MainScheduler.instance).subscribe { (event) in
// print(event)
// }.disposed(by: disposeB)
//這個方法有兩種用法蜓肆,一種是創(chuàng)建的 Observable序列在經(jīng)過設(shè)定的一段時間后颜凯,產(chǎn)生唯一的一個元素。
// Observable<Int>.timer(1, scheduler: MainScheduler.instance).subscribe{(event) in
// print("123",event)
// }.disposed(by: disposeB)
//
//
//另一種是創(chuàng)建的 Observable 序列在經(jīng)過設(shè)定的一段時間后仗扬,每隔一段時間產(chǎn)生一個元素装获。
Observable<Int>.timer(5, period: 1, scheduler: MainScheduler.instance).subscribe { (event) in
print(event)
}.disposed(by: disposeB)
}
enum MyError:Error {
case A
case B
var errorType:String {
switch self {
case .A:
return "i am error A"
case .B:
return "BBBB"
}
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
上面這段代碼是介紹的 Observable
的序列產(chǎn)生,也是非常簡單厉颤,輕量化