Vẫn là cái app ở bài 2, bây giờ mình nâng cấp 1 chút đó là sẽ có 2 text fields được edit và label sẽ update tương ứng. Trước khi bắt tay vào thực hiện, mình ngẫm 1 chút, nếu theo cách ở Phần 2, mình cứ gán 1 Variable rồi cho subscribe rồi gắn giá trị cho label.text. Cơ bản cách này cũng sẽ xử lý được nhưng rất rườm rà (vì nếu bạn update text 1 là A, xong bạn update text 2 là B thì chữ A trong label sẽ biến mất). Vậy mình sẽ dùng combineLastest. Update app 1 chút và mark Outlet cho nó.
App của mình như sau:
Vẫn như cách ở bài cũ, ta sẽ gắn Variable cho thằng Input 2, cũng như phần input bind cho nó.
Tại ViewModel class: (gắn Variable cho Input 2, chính là anotherInputText)
Tại ViewController class, connect giữa thằng txtAnotherInput và anotherInputText:
Để mình giải thích chỗ này một chút, như bài trước, ta chỉ cần return inputText.asObservable() là đủ. Nó sẽ trả về 1 chuỗi String cho mình. Bây giờ có đến 2 asObservable(), mình phải lấy cả hai cái và trả về như thế nào cho đúng.
Thì cái mình làm ở đây sẽ là Observable.combineLatest()
Bạn hãy để ý ở trên, có bao nhiêu asObservable() thì mình bỏ zô trong arguments hết, và trong cái trailing closure, mình khai số biến tương ứng với số arguments đó và nó đại diện luôn cho value mà thằng asObservable() được return.
Như vậy, coi như tiếp theo chỉ là phần logic code mà mình cần thực hiện theo yêu cầu nữa thôi, đoạn này mình ko giải thích nhiều.
Ở đây, mình thấy 1 cái hay của phần MVVM, đó là như sau:
Các bạn để ý mình xuất hiện thêm 1 component và cần xử lý code với chúng. Giả sử với mô hình MVC, thì bỏ chúng ở đâu (bao gồm Variable, Observable, binding) ? Chắc bỏ ở Controller, và nó sẽ phình to. Ở mô hình MVVM, mọi thứ được chia khá đều. VC chỉ có nhiệm vụ lấy signals/ data từ input, rồi show result lên output. Phần xử lý ta để ở VM.
Cụ thể trong ví dụ này, mặc dù mình thêm 1 component nhưng VC chỉ làm 1 cái duy nhất là binding data. Còn lại ko thêm gì nữa, logic code là để ở VM. Nhìn mọi thứ rất đẹp.
Run app để thấy kết quả: