Last active
November 30, 2022 10:46
-
-
Save iamchiwon/f007d67c8365b612daa99d6f19ad3992 to your computer and use it in GitHub Desktop.
DelegateProxy example
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// MARK:- UIImagePickerController.rx | |
import UIKit | |
import RxSwift | |
import RxCocoa | |
// picker.rx.didFinishPickingMediaWithInfo | |
// ~~~~~~ ~~ | |
// Base Reactive | |
extension Reactive where Base: UIImagePickerController { | |
public var didFinishPickingMediaWithInfo: Observable<[String : Any]> { | |
return RxImagePickerProxy.proxy(for: base) | |
.didFinishPickingMediaWithInfoSubject | |
.asObservable() | |
.do(onCompleted: { | |
self.base.dismiss(animated: true, completion: nil) | |
}) | |
} | |
public var didCancel: Observable<Void> { | |
return RxImagePickerProxy.proxy(for: base) | |
.didCancelSubject | |
.asObservable() | |
.do(onCompleted: { | |
self.base.dismiss(animated: true, completion: nil) | |
}) | |
} | |
} | |
public typealias ImagePickerDelegate = UIImagePickerControllerDelegate & UINavigationControllerDelegate | |
extension UIImagePickerController: HasDelegate { | |
public typealias Delegate = ImagePickerDelegate | |
} | |
class RxImagePickerProxy: DelegateProxy<UIImagePickerController, ImagePickerDelegate>, DelegateProxyType, UIImagePickerControllerDelegate, UINavigationControllerDelegate | |
{ | |
public init(imagePicker: UIImagePickerController) { | |
super.init(parentObject: imagePicker, delegateProxy: RxImagePickerProxy.self) | |
} | |
//MARK:- DelegateProxyType | |
public static func registerKnownImplementations() { | |
self.register { RxImagePickerProxy(imagePicker: $0) } | |
} | |
static func currentDelegate(for object: UIImagePickerController) -> ImagePickerDelegate? { | |
return object.delegate | |
} | |
static func setCurrentDelegate(_ delegate: ImagePickerDelegate?, to object: UIImagePickerController) { | |
object.delegate = delegate | |
} | |
//MARK:- Proxy Subject | |
internal lazy var didFinishPickingMediaWithInfoSubject = PublishSubject<[String : Any]>() | |
internal lazy var didCancelSubject = PublishSubject<Void>() | |
//MARK:- UIImagePickerControllerDelegate | |
func imagePickerController(_ picker: UIImagePickerController, | |
didFinishPickingMediaWithInfo info: [String: Any]) { | |
didFinishPickingMediaWithInfoSubject.onNext(info) | |
didFinishPickingMediaWithInfoSubject.onCompleted() | |
didCancelSubject.onCompleted() | |
} | |
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { | |
didCancelSubject.onNext(()) | |
didCancelSubject.onCompleted() | |
didFinishPickingMediaWithInfoSubject.onCompleted() | |
} | |
//MARK:- Completed | |
deinit { | |
self.didFinishPickingMediaWithInfoSubject.onCompleted() | |
self.didCancelSubject.onCompleted() | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
good