觀察者是用來監聽序列,當收到事件作出響應。

建立觀察者

對一個 Observable 進行 subscribe。事件發生時於後面的 onNextonErroronCompleted作出響應。

tap.subscribe(onNext: { [weak self] in
    self?.showAlert()
}, onError: { error in
    print("發生錯誤: \(error.localizedDescription)")
}, onCompleted: {
    print("完成任務")
})

AnyObserver

AnyObserver 可以用來描述任意一種觀察者。

範例:印出網路請求結果

URLSession.shared.rx.data(request: URLRequest(url: url))
    .subscribe(onNext: { data in
        print("Data Task Success with count: \(data.count)")
    }, onError: { error in
        print("Data Task Error: \(error)")
    })
    .disposed(by: disposeBag)

可以改寫為

let observer: AnyObserver<Data> = AnyObserver { (event) in
    switch event {
    case .next(let data):
        print("Data Task Success with count: \(data.count)")
    case .error(let error):
        print("Data Task Error: \(error)")
    default:
        break
    }
}

URLSession.shared.rx.data(request: URLRequest(url: url))
    .subscribe(observer)
    .disposed(by: disposeBag)

Binder

  • Binder 不會處理錯誤事件
  • 確保綁定都是在給定的 Scheduler 上執行 (默認為 MainScheduler)

範例: 這是一個UI觀察者,在響應事件時只會處理 next 事件,且需要在主執行緒更新 UI 的操作。

let observer: AnyObserver<Bool> = AnyObserver { [weak self] (event) in
    switch event {
    case .next(let isHidden):
        self?.usernameValidOutlet.isHidden = isHidden
    default:
        break
    }
}

usernameValid
    .bind(to: observer)
    .disposed(by: disposeBag)