Bài 1. RxSwift – Giới thiệu
1. Asynchronous Programming (Lập trình bất đồng bộ)
Nó là gì?
- Tất cả các phần trong chương trình của bạn hoạt động độc lập với nhau.
- Module này không chờ module kia.
- Dữ liệu nhận được sẽ quyết định trạng thái của các thành phần.
- Không thể biết trước được dữ liệu nhận được như thế nào và thời điểm nào. Ví dụ: Tải một ảnh từ Internet, trong khi tải về bạn vẫn có thể sử dụng UI của app cho các tác vụ khác.
1.1. Cocoa and UIKit asynchronous APIs
Ví dụ: in 100 số lên màn hình với 2 cách
- Đồng bộ với việc duyệt mãng từ 1~100 và print ra
var array = [1, 2, 3 ... 100]
for number in array {
print(number)
}
- Bất đồng bộ với việc không xác định thời điểm số tiếp theo được in ra
var array = [1, 2, 3 ... 100]
var currentIndex = 0
@IBAction func printNext(_ sender: Any) {
print(array[currentIndex])
if currentIndex < array.count {
currentIndex += 1
}
}
1.2 Các thuật ngữ
State
- Đây chính là biểu hiện dữ liệu trong ứng dụng của bạn. Từ đó tạo ra các trạng thái cho toàn bộ ứng dụng hay từng thành phần nhỏ hơn như là ViewController, ViewModel …
- Dựa vào mỗi trạng thái mà giao diện ứng dụng sẽ thay đổi theo. Nó quyết định View sẽ hiển thị gì.
- Chúng có thể truyền đi và có thể sửa đổi được.
Imperative programming
- Cũng khá là quen thuộc với các bạn. Chính là việc điều kiển hoặc thay đổi các trạng thái trong chương trình thông qua các câu lệnh.
- Ví dụ: Load API -> Config Data > Config UI > Update UI
- Chúng sẽ được thực hiện tuần tự.
- Điểm hạn chế lớn nhất là bạn cần phải quan tâm tới thứ tự thực hiện các lệnh này. Nếu không, thì với sự thay đổi vị trí thì dẫn đến chương trình bạn hoạt động không theo ý muốn.
Side effects
- Side Effect là những thay đổi phía bên ngoài của một scope (khối lệnh).
- Bạn nên biết rằng, khi bạn tác động làm thay đổi trạng thái của 1 thành phần thì không chỉ thành phần đó sẽ thay đổi. Mà có thể nó sẽ ảnh hưởng tới các thành phần khác.
- Quan trong ở đây là bạn phải kiểm soát chúng nó. Để giảm đi hoặc không cho phép các hiệu ứng khác xảy ra khi trạng thái của một thành phần nào đó thay đổi.
Declarative code
Đây chính là các đoạn code của bạn nhằm để cân bằng việc.
- Thay đổi các trạng thái
- Giảm đi các hiệu ứng phụ xảy ra.
Cũng chính là cách mà bạn cần phải luyện tập để hướng tới. Mọi thứ (biến, class, action …) đều được khai báo và cài đặt sẵn các hành động nếu trạng thái của chúng bị thay đổi. Thì chúng sẽ tự thay đổi theo.
Reactive systems
Để đảm bảo được hiệu suất tối đa thì tất cả mọi thứ phải hoạt động nhịp nhàng. Từ đó khái niệm Reactive systems được ra đời. Đơn giản là để app iOS và web có thể giao tiếp với nhau một cách nhuần nhuyễn hơn.
2. RxSwift
- Khái niệm Reactive Programming đã xuất hiện từ rất lâu rồi.
- Chủ yếu trên các nền tảng web.
- Giúp người lập trình quản lý được tốt hơn khi xử lý giao diện và logic trở nên quá nhiều.
- Reactive Extensions cho .NET (Rx), Microsoft, solving the problems of asynchronous, scalable, real time
- Rx trở thành phần mở rộng cho .Net 3.5 và .Net 4.0 thì đc build sẵn trong core
- RxJS, RxKotlin, Rx.NET, RxScala, RxSwift …
- Tất cả đều tương đồng về API
- Xem thêm tại đây : http://reactivex.io
Observables
Observables là nguồn phát dữ liệu mà có thể quan sát được từ các đối tượng khác trong chương trình. Các đối tượng của nó đều thuộc class Observable trong RxSwift.
Về khả năng:
-
Cho phép tạo ra 1 chuỗi các sự kiện bất đồng bộ.
-
Observer lắng nghe Observable. Về giá trị thì nó sẽ phát ra 3 kiểu sau đây:
-
element
-
error
-
completed Trong thực tế, việc phát ra các dữ liệu hay sự kiện của Observable thì có 2 trường hợp điển hình.
-
Các sự kiện được diễn ra theo 1 mạch logic nhất định.
API.download(file: "http://www...") .subscribe(onNext: { data in
// Append data to temporary file
},
onError: { error in
// Display error to user
},
onCompleted: {
// Use downloaded file
})
- Các sự kiện lặp đi lặp lại vô hạn.
UIDevice.rx.orientation .subscribe(onNext: { current in
switch current {
case .landscape:
// Re-arrange UI for landscape
case .portrait:
// Re-arrange UI for portrait
}})
Operators
Operators gọi là toán tử, hay là các function. Những toán tử là thứ, mà bạn sẽ phải sử dụng rất nhiều trong chương trình. Nó cũng là những thứ mà tạo nên tên tuổi cho RxSwift và họ hàng nhà React.
Ví dụ: Đơn giản, để biến đổi A -> B thì bạn có thể áp dụng các toán tử cho A và kết quả nhận được là B.
Các toán tử có thể nối đuôi nhau, đầu ra của 1 toán tử này chính là đầu vào của một toán tử khác.
Sẽ có những bài viết chi tiết về từng toán tử trong series.
Schedulers
- Lập lịch hay còn có thể điều khiển việc xử lý, tương tương tác ở các thread khác nhau.
- Tối ưu việc đồng bộ và bất đồng bộ trong chương trình.
- Nếu muốn hiểu sơ qua thì nó như là GCD vậy, tuy nhiên nó là phần khó và mình sẽ đề cập sau.
3. App architecture
- Với kiến trúc project thì RxSwift không gây ra ảnh hưởng nào tới project.
- Các mô hình MVC, MVP hay MVVM thì không bị thay đổi khi thêm RxSwift vào.
- Kể cả bạn thay đổi 1 function hay viết mới lại chúng thì đều không ảnh hưởng tới các phần khác
- Với môi hình MVVM thì kết hợp với RxSwift thì tăng hiệu quả hơn rất nhiều.
- Cần nắm rõ cấu trúc app hiện tại của project mình rồi sẽ quyết định triển khai RxSwift vào.
Tham khảo: https://fxstudio.dev/rxswift-gioi-thieu/
All rights reserved