Contents

  • Traits là gì?
  • Các loại Traits
    • Single
    • Completable
    • Maybe

Traits là gì?

Traits là observables nhưng với 1 phạm vi hành vi hẹp hơn so với các Observables thông thường.

Lợi ích của Traits:

  • Vì phạm vi hẹp hơn, nên khi sử dụng Traits thì sẽ làm cho người đọc clear hơn về í nghĩa của task.
  • Traits luôn được observe và subcribe trên Main.

Các loại Traits:

  • Trait trong RxSwift gồm 3 loại, đó là: Single, Completable

Single:

  • Single sẽ chỉ emit ra duy nhất 1 event, và event đó phải thuộc 1 trong 2 kiểu .success(value) hoặc .error.
  • .success(value) về bản chất là sự kết hợp của .next và .complete event của Observable.
  • Sau khi emit event, single sẽ tự terminate.

Demo

enum DevideError: Error {
    case divideByZero
}
func divide(number1: Int, number2: Int) -> Single<Int> {
    return Single<Int>.create(subscribe: { observer in
        if number2 == 0 {
             observer(.error(DevideError.divideByZero))
        } else {
             let result = number1 / number2
             observer(.success(result))
        }
        return Disposables.create()
    })
}
divide(number1: 10, number2: 2)
     .subscribe { (event) in
          switch event {
           case .success(let result):
                print(result)
           case .error( let error):
                print(error)
      }
}

Vì number2 khác 0, nên khi thực hiện hàm divide 10 cho 2 thì sẽ trả về 1 Single và nó sẽ emit ra .success(5).

Completable:

  • Completable sẽ chỉ emit ra duy nhất 1 event, và event đó phải thuộc loại .completed hoặc .error.
  • Sau khi emit ra event thì sẽ tự động terminate.
func divide(number1: Int, number2: Int) -> Completable {
    return Completable.create(subscribe: { observer in
        if number2 == 0 {
            observer(.error(DevideError.divideByZero))
        } else {
            let result = number1 / number2
            observer(.completed)
        }
        return Disposables.create()
    })
}

Maybe:

  • Maybe là sự kết hợp của Single và Completable. Nó có thể emit .success(value), .completed hoặc .error event.
  • Vẫn như 2 loại traits trên, Maybe sẽ chỉ emit ra 1 event duy nhất.
  • Sau khi emit ra event thì sẽ tự động terminate.
Maybe cho phép bạn emit ra 3 loại event khác nhau.
func divide(number1: Int, number2: Int) -> Maybe<Int> {
    return Maybe<Int>.create(subscribe: { observer in
        if number2 == 0 {
            observer(.error(DevideError.divideByZero))
        } else {
            let result = number1 / number2
            observer(.success(result))
        }
        return Disposables.create()
    })
}

Convert Traits thành Observable và ngược lại

  • Có thể convert 1 traits thành Observable đơn giản như sau:
single.asObservable()
  • Việc convert từ Observable thành Traits cũng đơn giản như vậy:
observable.asSingle()

Tuy nhiên Traits thì chỉ emit ra 1 event, còn Observable của bạn thì có thể sẽ emit ra nhiều event. Vì vậy nếu convert 1 Observable emit ra nhiều event sang Traits thì traits đó sẽ emit ra error. Ví dụ như sau:

let observable = Observable<String>.of("abc", "def")
observable.asSingle().subscribe({ event in
    switch event {
    case .success(let value):
        print(value)
    case .error(let error):
        print(error)
    }
})
Lỗi được emit ra.

Khi nào thì sử dụng Single, Completable & Maybe:

Single:

  • Single có tác dụng cho những tiến trình chỉ chạy 1 lần và sẽ thành công với 1 value, hoặc sẽ bị error.
  • Ví dụ như download File, load data, …

Completable:

  • Dùng cho những task mà bạn chỉ quan tâm xem nó thành công hay thất bại.
  • Ví dụ: Write file…

Maybe:

  • Dùng cho những task có thể success hoặc fail, và tùy lúc sẽ emit ra 1 value khi success.

Leave a Comment

* By using this form you agree with the storage and handling of your data by this website.