- vừa được xem lúc

Observable là gì? Cách tạo ra Observable

0 0 83

Người đăng: Nguyễn Văn Thuận

Theo Viblo Asia

RxSwift là một thư viện cho phép chúng ta sử dụng Swift một cách khác nhau. Với thư viện này, lập trình bất đồng bộ trở nên dễ thực hiện hơn và dễ đọc hơn. Nó cho phép bạn xây dựng các ứng dụng có kiến trúc liền lạc và chất lượng cao hơn.

Như các bạn đã biết, một device ( iphone, ipad, macbook, ...) đều có bộ CPU với rất nhiều nhân và nhiều luồng. Điều đó đòi hỏi, một chương trình tạo ra phải khai thác hết được sức mạnh của thiết bị đó, nhằm nâng cao trải nghiệm sử dụng của người dùng. Từ đó việc lập trình đa luồng ra đời nhằm chạy được các tác vụ ( khối code ) song song. Với ngôn ngữ Swift chúng ta có thể có rất nhiều cách để implement một ứng dụng có các tác vụ bất đồng bộ: NotificationCenter, Closure, Delegate Partern, Grand Central Dispatch và RxSwift.

Trong bài viết này chúng ta sẽ cùng nhau tìm hiểu về Observable và các cách tạo ra một Observable trong Swift. Let's GOOOOO!!!

1. Observable là gì?

  • Observable là một sequence, Observable sẽ nhả ( emit ) ra sự kiện ( event )
  • Observableimmutable, nghĩa là mỗi khi dùng method trong bộ toolbox (map, flatmap, combine, merge, filter,…) thì sẽ tạo ra 1 Observable mới chứ không biến đổi Observable cũ. image.png

Observable phát ra 3 loại event:

  • .next():event mang giá trị dữ liệu mới nhất. Đây chính là các Observers nhận các giá trị giữ liệu.
  • .error: Observable sẽ kết thúc với lỗi và không phát ra event.
  • .completed:event kết thúc của chỗi sự kiện, có nghĩa là sẽ không phát ra bất cứ event nào nữa.

2. Cách tạo ra một Observable

Sau đây chúng ta sẽ cùng nhau tìm hiểu cách tạo ra một Observable

2.1 .just()

Trong RxSwift, với phương thức .just() sẽ giúp chúng ta tạo ra một Observable phát ra duy nhất một eventterminate ngay lập tức.

 let disposeBag = DisposeBag() let observable = Observable.just("this is element") observable.subscribe { element in print(element) } .disposed(by: disposeBag)

Result:

 next(this is element) completed

2.2 .of()

Với phương thức .of() chúng ta sẽ tạo ra một Observable từ một chuỗi các phần tử cho trước. Kiểu dữ liệu của Observable là kiểu dữ liệu của dữ liệu truyển vào. Các phần tử sẽ truyền vào một cách tuần tự, sau khi hoàn thành sẽ tự động terminate.

 let disposeBag = DisposeBag() let observable = Observable.of(1, 9, 19, 5) observable.subscribe { element in print(element) } .disposed(by: disposeBag)

Result:

 next(1) next(9) next(19) next(5) completed

2.3 .from()

Với phương thức .from( ) cho phép khởi tạo một Observable với một chuỗi các phần tử trong một mảng cho trước. Kiểu dữ liệu của Observable sẽ là kiểu dữ liệu của các phần tử trong mảng. Các phần tử sẽ lần lượt được emit theo thứ tự trong mảng, sau đó Observable sẽ terminate.

 let array = [1, 5, 8, 9, 10, 4] let disposeBag = DisposeBag() let observable = Observable.from(array) observable.subscribe { element in print(element) } .disposed(by: disposeBag)

Result:

 next(1) next(5) next(8) next(9) next(10) next(4) completed

2.4 .range(start: , count: )

.range(start: , count: ) cho phép tạo ra một Observable với giá trị ban đầu (start) và số lượng các element tuần tự được tạo ra (count), sau đó sẽ terminate.

 let disposeBag = DisposeBag() let observable = Observable.range(start: 1, count: 5) observable.subscribe { element in print(element) } .disposed(by: disposeBag)

Result:

 next(1) next(2) next(3) next(4) next(5) completed

2.5 .empty()

Phương thức .empty( ) cho phép tạo ra một Observable nhưng không có bất kỳ element nào cả. Observable sẽ chỉ emit ra duy nhất một event .completed để terminate.

 let disposeBag = DisposeBag() let observable = Observable<Void>.empty() observable.subscribe( onNext: { element in print(element) }, onError: {error in print(error) }, onCompleted: { print("onCompleted") }, onDisposed: { print("onDisposed") }) .disposed(by: disposeBag)

Result:

 onCompleted onDisposed

2.6 .never()

Giống với phương thức .empty(), phương thức .never() cho phép tạo ra một Observable không có bất kỳ element nào cả nhưng khác với .empty() ở chỗ, phương thức .never() sẽ không bao giờ terminate.

 let disposeBag = DisposeBag() let observable = Observable<Void>.never() observable.subscribe( onNext: { element in print(element) }, onError: {error in print(error) }, onCompleted: { print("onCompleted") }) .disposed(by: disposeBag)

Result:

// Not emit anything

3. Tổng Kết

Trong bài viết này chúng ta đã cùng nhau tìm hiểu về Observable và các cách tạo ra một Observable. Để hiểu rõ hơn các bạn có thể tìm hiểu các tài liệu dưới đây:

Bình luận

Bài viết tương tự

- vừa được xem lúc

2 Cách để Triển Khai MVVM Trong Dự Án IOS

MVVM không nhất thiết phải bind cùng RxSwift, nhưng nó sẽ tốt hơn, vậy tại sao . MVVM Cùng Swift. Để thực hiện hai cách ràng buộc mà không phụ thuộc, chúng ta cần tạo Observable của riêng chúng ta. Đây là đoạn code :.

0 0 84

- vừa được xem lúc

Refresh token và retry request sử dụng RxSwift

Đặt vấn đề. Trong các dự án iOS sử dụng authenticator, việc đăng nhập thường hay được sử dụng bằng access token sau khi đã đăng nhập thành công bằng tài khoản và mật khẩu.

0 0 39

- vừa được xem lúc

RxSwift: KVO - Key Value Observing

I. Khái niệm:.

0 0 46

- vừa được xem lúc

Bài 3. RxSwift – DisposeBag

1.DisposeBag và vấn đề. . Nếu Observable không kết thúc thì sao nào.

0 0 10

- vừa được xem lúc

Bài 2. RxSwift – Observables

1. Observables. Đây là phần trung tâm của RxSwift. Observable chính là trái tim của cả hệ thống.

0 0 15

- vừa được xem lúc

Bài 1. RxSwift – Giới thiệu

1. Asynchronous Programming (Lập trình bất đồng bộ). Nó là gì. Module này không chờ module kia.

0 0 11