[RxSwift - Take note về RxSwift] - Các lưu ý dễ mắc phải (phần 1)
swift
57
RxSwift
7
RxCocoa
2
ios
48
Male avatar

Bùi Khánh Duy viết ngày 18/02/2019

[RxSwift - Take note về RxSwift] - Các lưu ý dễ mắc phải (phần 1)

1. Vấn đề về liên quan đến hot/ cold Observables:

Khi mới nghiên cứu về Hot-Cold Observables, các bạn đừng để ý gì về việc 1 dòng Stream hay nhiều dòng Stream. Với kiến thức hiện tại của mình tại lúc này, mình chỉ quan tâm: các driver UI như UIButton tap hay text UITextField có Hot Observable. Còn các Observable khác là mỗi khi có ai đó subscribe, nó mới emit. (khi nào cần đưa nó thành Hot thì trigger nó)

a. Ví dụ 1:

    let stringTest01: Driver<String?> = imageButton.flatMapLatest { image in
      print("[Debug] [stringTest01] day la image VM ne`\(image)")
      return RollcallService.uploadImage(withUid: Constant.currentUid ?? "", image: image!).asDriver(onErrorJustReturn: "")
    }

    let stringTest02: Driver<String?> = imageButton.flatMapLatest { image in
      print("[Debug] [stringTest02] day la image VM ne`\(image)")
      return RollcallService.uploadImage(withUid: Constant.currentUid ?? "", image: image!).asDriver(onErrorJustReturn: "")
    }

    stringTest01.drive(onNext: { resultString in
      print("[Debug] [atViewModel] Result string tai man hinh View Model \(resultString)")
    })

Khi run lên thì chuyện gì xảy ra, chỉ có [Debug] [stringTest01] được in ra cùng với [Debug] [atViewModel], còn stringTest02 không có ai subscribe nên nó không phát ra tín hiệu.

b. Ví dụ 2:

let allTextConditions = Driver.combineLatest(nameTextField, emailTextField, passwordTextField, descriptionTextField, positionTextField) { (name, email, password, descriptionUser, position) -> (Users) in
      print("[Debug] [allTextConditions] User is \(Users(name: name, email: email, password: password, descriptionUser: descriptionUser, position: position))")
      return Users(name: name, email: email, password: password, descriptionUser: descriptionUser, position: position)
    }

combineLatest chỉ là update mỗi lần có sự thay đổi của các text inside. Còn phần bên trong completion handler là chỉ khi nào có ai đó subscribe, nó mới gọi ra các công việc trong này.

2. Lỗi khi không subscribe/ drive được các Observables/ Drivers:

Cái lỗi này khiến mình bực mình nhất. Xem đoạn code sau:

 profileViewModel.signUpResult.drive { result in
      print("Ket qua la result \(result)")
    }

Sau khi có được tín hiệu từ ViewModel, mình chuyển qua bên View Controller, cái mà mình nhận được, lúc thì không có gì (lúc này chẳng hiểu vì sao), lúc thì nó ra cái định nghĩa của Driver (nhờ lúc này mới biết là mình thiếu onNext). Cho nên, các bạn cẩn thận nha:

 profileViewModel.signUpResult.drive(onNext: { result in
      print("Ket qua la result \(result)")
    })

3. Lưu ý về disposeBag và dispose:

Các bạn phải lưu ý cần thận việc này, đôi khi nhiều bạn cứ code như sau:

 profileViewModel.signUpResult.drive(onNext: { result in
      print("Ket qua la result \(result)")
    }).dispose()

Vì nếu mà dispose ở đó, tức là nó chỉ lắng nghe 1 lần rồi thôi, stop, ko observer nữa. Mà một khi ko có ai observe nó sẽ stop. Mọi thay đổi tiếp đó, mình sẽ không có kết quả gì. Dùng disposeBag sẽ giữ được sự lắng nghe cho đến khi dealloc màn hình hiện tại.

Như vậy, mình đã take note lỗi của mình. Hi vọng các bạn đọc được rồi rút kn cho bản thân.

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

Male avatar

Bùi Khánh Duy

9 bài viết.
22 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
Male avatar
4 0
Autolayout và lifecycle trong IOS 1. Lý thuyết: Trước hết, mình xin nói về một vài lifecycle trong swift để mọi người nhớ lại. Một câu hỏi phổ b...
Bùi Khánh Duy viết hơn 2 năm trước
4 0
Male avatar
2 0
Swift Closure: Bài 1: Closure cơ bản ===== Updated ngày 30/06 Updated một chút: Vì những bất tiện và không rõ ràng về thông tin của kipalog, mình...
Bùi Khánh Duy viết hơn 2 năm trước
2 0
Male avatar
1 5
RxSwift Phần bổ sung Bài 1: Hot và Cold Observables ===== Updated ngày 30/06 Updated một chút: Vì những bất tiện và không rõ ràng về thông tin củ...
Bùi Khánh Duy viết hơn 2 năm trước
1 5
Bài viết liên quan
White
14 4
(Link) (Link) (Link) Ở 2 phần tut trước, mình đã hướng dẫn khá chi tiết cách viết một ứng dụng camera có tích hợp chức năng nhận diện khuôn mặ...
HoangPH viết hơn 5 năm trước
14 4
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


Male avatar
{{userFollowed ? 'Following' : 'Follow'}}
9 bài viết.
22 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!