1. Disposable

- Observable 했던 작업을 중간에 취소 시킬 수 있다.

- observable에서 subscribe를 하면 Disposable 객체가 나오는데 이를 이용해서 동작중인 쓰레드를 멈출 수 있다.

- 이 방법을 사용하면 Flag를 이용해서 쓰레드를 멈추게 하는 번거로움이 해결된다.

    // MARK: - IBAction
    var dispos: Disposable?
    @IBAction func onLoadImage(_ sender: Any) {
        imageView.image = nil

        dispos = rxswiftLoadImage(from: LARGER_IMAGE_URL)
            .observeOn(MainScheduler.instance)
            .subscribe({ result in
                switch result {
                case let .next(image):
                    self.imageView.image = image

                case let .error(err):
                    print(err.localizedDescription)

                case .completed:
                    break
                }
            })
    }

    @IBAction func onCancel(_ sender: Any) {
        // TODO: cancel image loading
        dispos?.dispose()
    }

 

2. DisposBag

- 여러개의 Disposable을 한꺼번에 저장하고 Dispose할 수 있다.

- 기본적으로는 DisposBag 객체를 만들고 insert를 할 수 있으나 더 간략하게 Disposable.disposed(by: DisposBag)으로 만들 수 있다.

    // MARK: - IBAction
    var disposeBag: DisposeBag = DisposeBag()
    @IBAction func onLoadImage(_ sender: Any) {
        imageView.image = nil

        let dispos = rxswiftLoadImage(from: LARGER_IMAGE_URL)
            .observeOn(MainScheduler.instance)
            .subscribe({ result in
                switch result {
                case let .next(image):
                    self.imageView.image = image

                case let .error(err):
                    print(err.localizedDescription)

                case .completed:
                    break
                }
            })
        disposeBag.insert(dispos)
        
    }

    @IBAction func onCancel(_ sender: Any) {
        // TODO: cancel image loading
        disposeBag = DisposeBag()
    }
    // MARK: - IBAction
    var disposeBag: DisposeBag = DisposeBag()
    @IBAction func onLoadImage(_ sender: Any) {
        imageView.image = nil

        rxswiftLoadImage(from: LARGER_IMAGE_URL)
            .observeOn(MainScheduler.instance)
            .subscribe({ result in
                switch result {
                case let .next(image):
                    self.imageView.image = image

                case let .error(err):
                    print(err.localizedDescription)

                case .completed:
                    break
                }
            }).disposed(by: disposeBag)
        
    }

    @IBAction func onCancel(_ sender: Any) {
        // TODO: cancel image loading
        disposeBag = DisposeBag()
    }

'앱 개발자 역량 > IOS' 카테고리의 다른 글

RxSwift ] 4. 다양한 operator 확인 방법  (0) 2019.07.16
RxSwift ] 3. Operator  (0) 2019.07.13
RxSwift ] 1. 개요 및 Observable  (0) 2019.07.13
ios ]AppStore 배포하기  (0) 2019.07.09
Swift ] 이미지 불러오기  (0) 2019.06.19

+ Recent posts