RxSwiftCommunity / RxMediaPicker

A reactive wrapper built around UIImagePickerController.
MIT License
180 stars 62 forks source link

Can't open the Image Picker for the second time #33

Open lutluthfi opened 3 years ago

lutluthfi commented 3 years ago

Hi, I can't open the ImagePicker for the second time. After looking into the code, here are what I got:

  1. I got the observer will emit onError when the app did cancel the Image Picker, so it will emit onDisposed also.

    open func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        dismiss(picker)
    
        if let action = currentAction {
            switch action {
            case .photo(let observer): observer.on(.error(RxMediaPickerError.canceled))
            case .video(let observer, _): observer.on(.error(RxMediaPickerError.canceled))
            }
        }
    }
  2. I got the observer will emit onComplete when the app finishes pick the image, it will emit onDisposed also.

    func processPhoto(info: [UIImagePickerController.InfoKey: Any],
                      observer: AnyObserver<(UIImage, UIImage?)>) {
        guard let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage else {
            observer.on(.error(RxMediaPickerError.generalError))
            return
        }
    
        let editedImage = info[UIImagePickerController.InfoKey.editedImage] as? UIImage
        observer.onNext((image, editedImage))
        observer.onCompleted()
    }

That's why I can't open the ImagePicker for the second time. So, these are what I suggest:

  1. Only call dismiss(picker) inside func imagePickerControllerDidCancel(_ picker: UIImagePickerController)

    open func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        dismiss(picker)
    }
  2. Call onComplete after picking the image is not necessary

    func processPhoto(info: [UIImagePickerController.InfoKey: Any],
                      observer: AnyObserver<(UIImage, UIImage?)>) {
        guard let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage else {
            observer.on(.error(RxMediaPickerError.generalError))
            return
        }
    
        let editedImage = info[UIImagePickerController.InfoKey.editedImage] as? UIImage
        observer.onNext((image, editedImage))
    }