RxSwift 入門練習(xí)總結(jié)

demo.gif

使用的第三方庫

target 'WeatherDemo_RxSwift' do

  use_frameworks!

  pod 'RxSwift', '~> 3.5.0'
  pod 'RxCocoa', '~> 3.5.0'
  pod 'RxDataSources', '~> 1.0.4'
  
end

1.所有的控制器都加上析構(gòu)函數(shù),以方便查看是否有循環(huán)引用

deinit {
        print("\(self) 釋放")
 }

2.按鈕訂閱點擊事件

tapButton.rx.tap
            .subscribe({ [unowned self] _ in
                let numStr : String = self.numberLabel.text!
                let number = Int(numStr)
                self.numberLabel.text = String(number! + 1)
            
            }).addDisposableTo(disposeBag)

注意: 一定要加[unowned self],或者[weak self]否則會出現(xiàn)循環(huán)引用,關(guān)于它倆的使用情況,參考@ONEVCAT內(nèi)存管理,WEAK 和 UNOWNED

3.訂閱手勢事件,給按鈕添加長按手勢

let longPressGesture = UILongPressGestureRecognizer()
longPressGesture.rx.event
            .subscribe(onNext: { [unowned self] _ in
            
                let numStr : String = self.numberLabel.text!
                let number = Int(numStr)
                self.numberLabel.text = String(number! + 1)
                
            }).addDisposableTo(disposeBag)
self.tapButton.addGestureRecognizer(longPressGesture)

此處,用了subscribe.onNext.注意:onNext 只監(jiān)聽sequence發(fā)出的next事件中的element進行處理,他會忽略error和completed事件

疑問點:大部分情況subscribe 硬敲出來的 為啥代碼沒有自動補全???

4.結(jié)合tableView,Variable使用示例

// Variable流,初始值字符串?dāng)?shù)組
let items = Variable(["Mike",
                    "Apples",
                    "Ham",
                    "Eggs"])

let items2 = [
            "Fish",
            "Carrots",
            "Mike",
            "Apples",
            "Ham",
            "Eggs",
            "Bread",
            "Chiken",
            "Water"
        ]

// Variable使用必須要加asObservable
// 數(shù)據(jù)流綁定到tableView 
items.asObservable()
            .bind(to: tableView.rx.items(cellIdentifier: "Cell",cellType:UITableViewCell.self),curriedArgument: { (row, element, cell) in
                cell.textLabel?.text = element
            }).addDisposableTo(disposeBag)

// 原生的refresh
refreshControl.rx.controlEvent(.valueChanged)
        .subscribe(onNext: { [unowned self] _ in
          // 更改Variable.value 模擬刷新
            items.value = items2
            self.refreshControl.endRefreshing()
        }).addDisposableTo(disposeBag)
        
tableView.addSubview(refreshControl)
知識點:
  • 要理解Variable,需要先理解Subject,Subjet是observable和Observer之間的橋梁,一個Subject既是一個Obserable也是一個Observer,他既可以發(fā)出事件,也可以監(jiān)聽事件
  • BehaviorSubject : 當(dāng)你訂閱了BehaviorSubject,你會接受到訂閱之前的最后一個事件
  • Variable是BehaviorSubject一個包裝箱,就像是一個箱子一樣,使用的時候需要調(diào)用asObservable()拆箱,里面的value是一個BehaviorSubject,他不會發(fā)出error事件,但是會自動發(fā)出completed事件

5.逆向傳值,代理使用示例

// 代理聲明 必須要繼承 class 否則報錯
protocol DataEnteredDelegate: class {
    func userDidEnterInformation( info: String )
}

// 代理聲明必須要weak,防止循環(huán)引用
weak var delegate : DataEnteredDelegate? = nil

// 監(jiān)聽鍵盤右下角done事件,調(diào)用代理方法
@IBAction func textOnExit(_ sender: Any) {
    delegate?.userDidEnterInformation(info: textField.text!)
    self.navigationController?.popViewController(animated: true)
}
知識點:
  • 需要把protocol 限制在 class 內(nèi),這是因為 Swift 的 protocol 是可以被除了 class 以外的其他類型遵守的, 而對于像 struct 或是 enum 這樣的類型,本身就不通過引用計數(shù)來管理內(nèi)存,所以也不可能用 weak 這樣的 ARC 的概念來進行修飾
    王巍 (@ONEVCAT) delegate

6. 第三方RxDataSources使用示例

// 1.數(shù)據(jù)流 just用法
let items = Observable.just([
        SectionModel(model: "B",items:[
            "Barbara Cole",
            "Barbara Cooper",
            "Barbara Diaz",
            "Barbara Edwards",
            "Barbara Garcia",
            "Barbara Gray",
            "Barbara Griffin",
            "Barbara Hill",
            "Barbara Howard",
            "Barbara Hughes"
            ]),
        SectionModel(model:"C",items:[
            "Carol Lopez", "Carol Lopez"
            ]),
        SectionModel(model: "E", items: [
            "Elizabeth Jenkins", "Elizabeth Kelly"
            ]),
        SectionModel(model: "H", items: ["Helen Anderson", "Helen Bailey", "Helen Cole", "Helen Cox"]),
        SectionModel(model: "J", items: ["James Anderson", "James Barnes", "James Bell"]),
        SectionModel(model: "K", items: ["Karen Green", "Karen Jenkins", "Karen Jones", "Karen Jordan"]),
        SectionModel(model: "L", items: ["Linda Taylor", "Linda Taylor", "Linda Torres", "Linda West", "Lisa Brooks"]),
        SectionModel(model: "M", items: ["Margaret Bell", "Margaret Coleman", "Margaret Cox", "Margaret Foster"]),
        SectionModel(model: "R", items: ["Robert Clark", "Robert Coleman", "Robert Cook", "Robert Cook"]),
        SectionModel(model: "S", items: ["Susan Fisher", "Susan Ford", "Susan Ford", "Susan Hernandez", "Susan Howard"]),
        ])

// 2.創(chuàng)建數(shù)據(jù)源 類型<String,String>
let dataSource = RxTableViewSectionedReloadDataSource<SectionModel<String,String>>()

// 3. dataSources配置cell
fileprivate func setupDataSource() {
        
        // 參數(shù)必須4個,_占位用
        dataSource.configureCell =  { (_,tableView,IndexPath,element) in
            let cell = tableView.dequeueReusableCell(withIdentifier: "Cell")!
            cell.textLabel?.text = element
            return cell
        }
        
        // 監(jiān)聽右側(cè)邊緣小字母點擊事件
        dataSource.sectionForSectionIndexTitle = { (dataSource,title,index) -> Int in
            print("\(index)")
            return index
        }
        
        dataSource.sectionIndexTitles = { data -> [String]? in
            return data.sectionModels.map{ $0.model }
        }
    }

//  4. 數(shù)據(jù)流items,綁定到dataSource上
 items.bind(to: tableView.rx.items(dataSource: dataSource))

// 5. 設(shè)置tableView代理
 _ = tableView.rx.setDelegate(self)

7. 自定義可觀察序列create 示例

//  create 自定義可觀察序列 返回的WeatherData 類型流
     func fetchWeatherData() -> Observable<WeatherData> {
        let observable = Observable<WeatherData>.create { [weak self] observer in
            if let weakSelf = self{
                let time = 0.5 + TimeInterval(arc4random_uniform(10)) / 10.0
                
                // 主線程延遲處理,模擬網(wǎng)絡(luò)請求數(shù)據(jù)
                DispatchQueue.main.asyncAfter(deadline: .now() + time, execute: { 
                    let shouldFail = arc4random_uniform(2) == 0
                    if shouldFail {
                        observer.onError(NSError(domain:"Fake network error", code: 0, userInfo: nil))
                    }else{
                        observer.onNext(weakSelf.createRandomWeatherData())
                        observer.onCompleted()
                    }
                    
                })
            }
            return Disposables.create() // 固定寫法,記住 需實現(xiàn).onError() .onNext .onCompleted
        }
        return observable.shareReplay(1)
    }
// 建議使用addDisposableTo
self.viewModel.locationName.drive(self.locationLabel.rx.text).addDisposableTo(disposeBag)

// 而不是用 disposed(by: disposeBag)
self.viewModel.locationName.drive(self.locationLabel.rx.text).disposed(by: disposeBag)

// 按鈕tap事件建議使用subscribe
button.rx.tap
            .subscribe(onNext:{
                [unowned self] in
                let selectedDate = dateFormatter.string(from: self.datePicker.date)
                self.title = selectedDate
            }).addDisposableTo(disposeBag)

// 而不是用bind
button.rx.tap
            .bind { [unowned self] in
                let selectedDate = dateFormatter.string(from: self.datePicker.date)
                self.title = selectedDate
        }.addDisposableTo(disposeBag)

RxSwift概念理解
RxSwift學(xué)習(xí)資料,內(nèi)涵很多RxSwift開源項目
本示例下載

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 RxSwift入坑解讀-你所需要知道的各種概念 沸沸騰關(guān)注 2016.11.27 19:11*字...
    楓葉1234閱讀 2,937評論 0 2
  • 本文章內(nèi)部分圖片資源來自RayWenderlich.com 本文結(jié)合自己的理解來總結(jié)介紹一下RxSwift最基本的...
    FKSky閱讀 3,043評論 4 14
  • //PublishSubject -> 會發(fā)送訂閱者從訂閱之后的事件序列 PublishSubjectlet se...
    andrewJN閱讀 1,682評論 0 3
  • 尋尋覓覓不知冬夏 兜兜轉(zhuǎn)轉(zhuǎn)不知真假 我們沖空曠歇斯底里 聽聲音消失在眼下 褪去層層天真的傷疤 披上塊塊成熟的鎧甲 ...
    風(fēng)蓬非悲歌閱讀 267評論 0 2
  • 俗語云:花無百日紅,人無百日好?;蛟S每天的快節(jié)奏生活,令我不得不因病做手術(shù),使生活得以慢下腳步,手術(shù)...
    一攬陽光閱讀 216評論 0 3

友情鏈接更多精彩內(nèi)容