Home

RxSwift( Part1) - Functional Reactive Programming & Observable

Word count: 908 / Reading time: 6 min
2018/09/09 Share

Nếu là iOS Developer chắc các bạn không còn xa lạ gì với thư việc RxSwift nửa rồi, theo thời gian hoàn thiện thì trong vòng 2 năm trở lại đây nó đã trở “trend” trong lập trình ứng dung iOS. Mọi công ty, cá nhân.. đều sử dụng để giúp cho quá trình phát triển ứng dụng được nhanh và “tin cậy” hơn. Vậy đâu là những lợi ích mà Rx mang lại để nó được sử dụng rộng rãi như vậy?

Functional Reactive Programming:

Trước khi tìm hiểu về thư viện RxSwift thì chúng ta phải biết về Functional Reactive Programming (FRP). FPR là sự kết hợp giữa Reactive ProgrammingFunctional Programming.

Có rất nhiều định nghĩa về Reactive Programming và sau khi tìm hiểu, tham khảo thì mình thấy định nghĩa của Andre Staltz được thừa nhận rộng rãi nhất:

“Reactive programming is programming with asynchronous data streams“

Everything is stream

Có hai từ khóa bạn cần chú ý trong định nghĩa trên là asynchronousstreams . Trong FRP tất cả dữ liệu đều được truyền tải dưới dạng stream theo trình tự thời gian, việc này giúp cho việc xác định các trạng thái (như data trả về, error, completed…) của một tác vụ bất đồng bộ (asynchronous) trở nên dễ dàng hơn. Ngoài ra điều làm nên sức mạnh của FRP là việc áp dụng functional programming để filter, chuyển đổi hoặc kết hợp các stream với nhau để tạo nên stream mới mà không làm thay đổi trạng thái của nó. Khái niệm thì có vẻ khó hiểu nhưng nhìn chung ý tưởng chính của FRP là khả năng phản ứng với các thay đổi - các dữ liệu mới nhất bằng cách sử dụng data stream một cách linh hoạt.

RxSwift :

RxSwift là framework hỗ trợ lập trình FRP bằng ngôn ngữ Swift trong các ứng dụng iOS.

Stream :

Trong FRP để các đối tượng chủ động phản hồi khi có sự thay đổi thì phải tạo ra 2 đối tượng là Observer (quan sát) và Observable (có thể quan sát), hai đối tương sẽ được kết với nhau thông qua stream. Mọi thứ trong FPR đều là stream.

Click button: tap–tap–tap–tap -> Stream
Scroll TableView: scroll–scroll–scroll -> Stream
Request API: request–completed–data -> Stream

Observable :

Observable là trái tim của RX, là nơi khởi nguồn của stream.
Observer lắng nghe tới Observable, và nhận được những signal được emit từ Observable.
Các Observable thì có thể không phát hoặc phát là nhiều sự kiện trong suốt vòng đời tồn tại của mình. Trong RxSwift, mỗi một observable có thể có các trạng thái sau:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
let hello = Observable.from(["H","e","l","l","o"])

let subscription = hello.subscribe { event in
switch event {
case .next(let value):
print(value)
case .error(let error):
print(error)
case .completed:
print("completed")
}
}

OUTPUT:
H e l l o
completed
  • .next(value: T) :  Khi một giá trị hoặc một tập hợp các giá trị được thêm vào observable. Nó cũng sẽ gửi các giá trị này tới các subscribers đã subscribe trước đó.

  • .error(error: Error) : Nếu gặp lỗi, một observable sẽ phát ra một sự kiện lỗi . Và observable này cũng sẽ bị hủy.

  • .completed : Nếu một observable kết thúc, nó cũng sẽ gửi một sự kiện kết thúc tới các subscribers.

Cách tạo Observable :

RxSwift hỗ trợ khá nhiều hàm để tạo observable như of, from, create, deferred, just, interval..

  • create

    1
    2
    3
    4
    5
    6
    7
    Observable.create { observer in
    observer.onNext(data)
    observer.onComplete()
    return Disposables.create {
    ...
    }
    }
  • of:

    1
    Observable.of("a", "b", "c") // tạo ra 3 events "a", "b", "c"
  • just:

    1
    Observable.just([1, 2, 3]) // tạo ra 1 event với giá trị [1, 2, 3]
  • interval:

    1
    2
    let scheduler = ConcurrentDispatchQueueScheduler(globalConcurrentQueueQOS: .background)
    Observable.interval(60, scheduler: scheduler)

Đến đây thì các bạn đã có cái nhìn khái quát về Observable trong RxSwift hẹn gặp lại trong các bài về RxSwift tiếp theo.

CATALOG
  1. 1. Functional Reactive Programming:
  2. 2. RxSwift :
    1. 2.1. Stream :
    2. 2.2. Observable :
      1. 2.2.1. Cách tạo Observable :