一個(gè)Combine Demo苹支。
Combine是蘋果發(fā)布的響應(yīng)式框架嗜历,iOS13一起發(fā)布的搜锰,所以最低iOS13才能使用伴郁。
做了一個(gè)簡(jiǎn)單登錄界面的異步處理演示。
頁(yè)面邏輯說(shuō)明:
獲取驗(yàn)證碼按鈕是否啟用(isEnabled)跟手機(jī)號(hào)輸入框值是否有效有關(guān)蛋叼。輸入11位長(zhǎng)度字符串獲取驗(yàn)證碼按鈕isEnabled變?yōu)閠rue焊傅。
登錄按鈕是否啟用(isEnabled)跟三個(gè)控件狀態(tài)或值相關(guān)聯(lián),分別是:手機(jī)號(hào)輸入框內(nèi)容狈涮、驗(yàn)證碼輸入框內(nèi)容以及同意隱私政策開(kāi)關(guān)狐胎。三個(gè)控件同時(shí)滿足校驗(yàn)才能改登錄按鈕isEnabled位true。
代碼部分
創(chuàng)建三個(gè)用@Published修飾的變量歌馍,用于接受控件內(nèi)容
@Published var phone: String? = ""
@Published var verifyCode: String? = ""
@Published var isAgree: Bool = false
@IBAction func phoneChanged(_ sender: UITextField) { phone = sender.text }
@IBAction func verifyCodeChanged(_ sender: UITextField) { verifyCode = sender.text }
@IBAction func agreeChanged(_ sender: UISwitch) { isAgree = sender.isOn }
創(chuàng)建校驗(yàn)手機(jī)號(hào)發(fā)布者握巢,輸出值為布爾類型
// 校驗(yàn)手機(jī)號(hào)的發(fā)布者
var phoneValid: AnyPublisher<Bool, Never> {
$phone
.map { $0?.count == 11 ? true : false }
.eraseToAnyPublisher()
}
創(chuàng)建校驗(yàn)驗(yàn)證碼發(fā)布者
// 校驗(yàn)驗(yàn)證碼的發(fā)布者
var verifyCodeValid: AnyPublisher<Bool, Never> {
$verifyCode
.map { code in
guard // 驗(yàn)證碼校驗(yàn)邏輯(實(shí)際情況按照需求自定義)
let code = code, // 值不能為nil
code.count == 4, // 長(zhǎng)度為4
let _ = Int(code) // 能轉(zhuǎn)為Int
else { return false } // 以上三種全部滿足返回true,否則返回false
return true
}
.eraseToAnyPublisher() // 抹去類型轉(zhuǎn)為AnyPublisher
}
合并三個(gè)發(fā)布者 - CombineLatest
// 融合三個(gè)發(fā)布者
Publishers.CombineLatest3(phoneValid, verifyCodeValid, $isAgree)
.map { $0 && $1 && $2 } // 篩選邏輯
.receive(on: RunLoop.main) // 在主線程接受
.assign(to: \.isEnabled, on: toLogin) // 結(jié)果分配
.store(in: &subscriptions) // 返回值Cancellable對(duì)象儲(chǔ)存在全局容器中