- rx 不建議開始就硬要把基礎(chǔ)的啃透了在入手
- 只需要看的懂做了什么,做完有什么效果可以先入手一些實(shí)戰(zhàn)了.
- 模仿官方demo 使用rxcocoa 來構(gòu)建你的項(xiàng)目.并使用,使用完畢你會(huì)有一點(diǎn)懂了.但是越用你會(huì)越不懂(這個(gè)我寫到后面應(yīng)該會(huì)體會(huì)更深..畢竟菜鳥級(jí)別現(xiàn)在)
- demo1 中使用
Observable.combineLatest(number1.rx.text.orEmpty, number2.rx.text.orEmpty, number3.rx.text.orEmpty) { textValue1, textValue2, textValue3 -> Int in
return (Int(textValue1) ?? 0) + (Int(textValue2) ?? 0) + (Int(textValue3) ?? 0)
}
.map { $0.description }
.bind(to: result.rx.text)
.disposed(by: disposeBag)
完成了一個(gè)實(shí)用的加法器.非常簡潔,rx.text.orEmpty轉(zhuǎn)到定義看四個(gè)observerble 的類型,大致可以看到在rx中我們把數(shù)據(jù)全部當(dāng)成了observerble類型去處理.從這里我們看出一個(gè)思想,Observable內(nèi)置許多的函數(shù)會(huì)很方便構(gòu)建需要的事件流,這個(gè)東西表象上就是將數(shù)據(jù)本身加上一個(gè)時(shí)間的維度,太抽象了 惡心,時(shí)間維度個(gè)人理解在程序上就是一個(gè)監(jiān)聽者,它會(huì)默默的一直(時(shí)間)幫你看查一個(gè)數(shù)據(jù)的變化,Observable 將整個(gè)變化封裝成了一個(gè)序列,數(shù)據(jù)的流,每一次變化,數(shù)據(jù)會(huì)流出來,你在閉包內(nèi)處理這個(gè)流就OK了.
- demo2
let phonevalid = txtphone.rx.text.orEmpty.map { $0.characters.count == self.validnumber }.share(replay: 1)
let pwdvalid = txtpwd.rx.text.orEmpty.map { $0.characters.count == self.pwdnumber }.share(replay: 1)
let everthingvalid = Observable.combineLatest(phonevalid, pwdvalid) { $0 && $1 }.share(replay: 1)
everthingvalid.bind(to: btnlogin.rx.isEnabled).disposed(by: disposeBag)
everthingvalid.subscribe(onNext: { (ok) in
print(ok)
ok ? self.btnnormal():self.btnforbidden()
}, onError: nil, onCompleted: nil, onDisposed: nil).disposed(by: disposeBag)
btnlogin.rx.tap
.subscribe(onNext: { [weak self] _ in
//去登錄
})
.disposed(by: disposeBag)
登錄的驗(yàn)證操作是些很繁雜的事情.rxcocoa 幫我們在ui上的好多東西構(gòu)建了好了,如rx.text等等,bind 時(shí)將一個(gè)序列鏈接上另一個(gè)序列,a 返回的結(jié)果可以作為b的一個(gè)序列,如當(dāng)我們希望郵箱合法時(shí),讓textfield文本框做一些變化,傳統(tǒng)上我們都直接各種代理實(shí)現(xiàn),回調(diào)函數(shù)中處理讓textfiled 做變化。
有了rxcocoa 可以
import Rxswift
import Rxcocoa
let phonevalid = txtphone.rx.text.orEmpty.map { $0.characters.count == 11 }.share(replay: 1)
extension UITextField{
var showview:AnyObserver<Bool>{
return Binder(self) { textfield, valid in
textfield.backgroundColor = UIColor.red
}.asObserver()
}
}
phonevalid
.bind(to: passwordOutlet.rx.isEnabled)
.disposed(by: disposeBag)
everthingvalid.subscribe({ (ok) in
ok ? 去登:驗(yàn)證不通過
})