6 API warppers
這個(gè)demo就是大體演示了幾個(gè)UIKit 擴(kuò)展的一些Reactive 屬性
沒啥好說的,這邊就隨便寫寫了
這邊的 <->
的操作符,一開始我還是有點(diǎn)懵逼楼雹。
發(fā)現(xiàn)在Operators
文件中烫沙,是創(chuàng)建的拓展操作符确丢。就是綁定。平常應(yīng)該用不到奇钞。
平時(shí)我們UIKit的屬性 一般都改成響應(yīng)式都有3個(gè)分類
1 Binder
遵循 ObserverType
協(xié)議
UILabel為例
/// Bindable sink for `text` property.
public var text: Binder<String?> {
return Binder(self.base) { label, text in
label.text = text
}
}
text
和 Binder
都是繼承Binder
這說這些屬性只能是訂閱者。不能去發(fā)送消息漂坏。
只能這樣使用
xxx.bind(to: text)
2 ControlEvent
遵循 ControlEventType
協(xié)議 上層又是 ObservableType
這說明 這是可訂閱的
UIButton 為例
/// Reactive wrapper for `TouchUpInside` control event.
public var tap: ControlEvent<Void> {
return controlEvent(.touchUpInside)
}
tap
就是 ControlEvent
類型
看ControlEvent
源碼景埃,克直接訂閱 也可以轉(zhuǎn)化為 Observable
訂閱
public func subscribe<O : ObserverType>(_ observer: O) -> Disposable where O.E == E {
return _events.subscribe(observer)
}
/// - returns: `Observable` interface.
public func asObservable() -> Observable<E> {
return _events
}
3 ControlProperty
遵循ControlPropertyType
協(xié)議 上層是 ObservableType, ObserverType
以UITextField
為例
/// Reactive wrapper for `text` property.
public var text: ControlProperty<String?> {
return value
}
textfiled的text 既可以發(fā)送休息,也可以接受消息
總結(jié)的來說顶别,還是ObservableType, ObserverType
一般來說ObserverType
都是那些顯示的屬性去遵循谷徙。ObservableType
都是一些事件屬性和與用戶有交互的一些屬性(例如textfiled的text)去遵循
7 Calculator
哇 這個(gè)真是看的頭皮發(fā)麻 溜了 有時(shí)間補(bǔ)上
8 ImagePicker
這個(gè)demo 重點(diǎn)就是擴(kuò)展了創(chuàng)建了imagePicker的過程
我們來看vc 中的代碼
cameraButton.rx.tap
.flatMapLatest { [weak self] _ in //1 tap -> picker
return UIImagePickerController.rx.createWithParent(self) { picker in
picker.sourceType = .camera
picker.allowsEditing = false
} //2 -> info
.flatMap { $0.rx.didFinishPickingMediaWithInfo }
.take(1)
}
.map { info in //3 info map image
return info[UIImagePickerControllerOriginalImage] as? UIImage
}
.bind(to: imageView.rx.image) //4 binder
.disposed(by: disposeBag)
tap -> create picker -> image -> binder
這里flatMapLatest
我感覺沒有必要 因?yàn)閯?chuàng)建picker信號序列,應(yīng)該不存在信號延遲的問題驯绎。這里我感覺可以換成flatMap
這里重點(diǎn)就是tap 的event 信號 轉(zhuǎn)換為 picker序列
extension Reactive where Base: UIImagePickerController {
static func createWithParent(_ parent: UIViewController?, animated: Bool = true, configureImagePicker: @escaping (UIImagePickerController) throws -> () = { x in }) -> Observable<UIImagePickerController> {
return Observable.create { [weak parent] observer in
let imagePicker = UIImagePickerController() //
let dismissDisposable = imagePicker.rx
.didCancel
.subscribe(onNext: { [weak imagePicker] _ in
guard let imagePicker = imagePicker else {
return
}
dismissViewController(imagePicker, animated: animated)
})
do {
try configureImagePicker(imagePicker)
}
catch let error {
observer.on(.error(error))
return Disposables.create()
}
//
guard let parent = parent else {
observer.on(.completed)
return Disposables.create()
}
parent.present(imagePicker, animated: animated, completion: nil)
observer.on(.next(imagePicker))
return Disposables.create(dismissDisposable, Disposables.create {
dismissViewController(imagePicker, animated: animated)
})
}
}
}
代碼 我們來一步一步看
1 方法名
static func createWithParent(_ parent: UIViewController?, animated: Bool = true, configureImagePicker: @escaping (UIImagePickerController) throws -> () = { x in }) -> Observable<UIImagePickerController>
這個(gè)configureImagePicker 差點(diǎn)看懵逼了 其實(shí)就是給了一個(gè)空實(shí)現(xiàn)完慧。沒什么作用
1 創(chuàng)建imagepicker
2 訂閱取消按鈕 dismiss
3 配置 imagepicker
4 發(fā)送imagepicker
5 present
6 返回Disposables