458
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.
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)
}
})
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.