RxSwift: Bài 6: RxCocoa (Part 5) - Disposing with RxCocoa
RxSwift
20
swift
71
ios
55
RxCocoa
6
Male avatar

Bùi Khánh Duy viết ngày 30/06/2018

RxSwift: Bài 6: RxCocoa (Part 5) - Disposing with RxCocoa

=====
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 mới dọn về nhà mới ở đây, thoải mái, đẹp đẽ rõ ràng hơn kipalog. Mong các bạn có thể theo dõi tại trang web của mình để cập nhật thêm nha

Mình mới viết một loạt bài về chủ đề Clean Architecture và Service Locator. Các bạn có thể theo dõi.
Page trên facebook ở đây: ở đây

=====
1. Giới thiệu
Phần này chủ yếu là lý thuyết. Như đã giải thích, có 1 cái bag ở bên trong Main View Controller mà giữ trách nhiệm sẽ xử lý tất cả các subscriptions khi VC bị released. Nhưng cả 1 loạt bài này, bạn không hề thấy weak hay unowned trong các closures. Why?
Bởi vì app của mình đang là single view controller, cho nên nó lúc nào cũng hiển thị khi app đang chạy, do đó không cần lo chuyện retain cycles hay leak memory.

2. unowned and weak với RxCocoa
Khi xử lý với RxCocoa hay RxSwift, khá khó hiểu khi nào dùng weak, khi nào dùng unowned. Bạn muốn sử dụng weak khi bạn có 1 closure có thể được gọi tại lúc nào đó trong tương laikhi mà đối tượng self hiện tại của nó đã bị release. Cũng vì lý do này, self trở thành Optional.

unowned được dùng để tránh Optional self. Nhưng code phải đảm bảo chắc chắn 100% là object sẽ không bị released trước khi closure được gọi, nếu không thì app sẽ bị crash.

Trong RxSwiftRxSwift, đặc biệt RxCocoa, có 1 vài mẹo để chọn khi nào không cần làm gì, khi nào dùng weak, khi nào dùng unowned:
In RxSwift – and especially with RxCocoa – there are some good guidelines to follow when choosing to use weak, unowned or nothing at all:
• không làm gì: khi ở bên trong 1 singletons hay ở tỏng 1 VC mà không bao giờ bị release (e.g. the root view controller).
• unowned: Inside all view controllers which are released after the closure task is performed. Bên trong tất cả các view controllers mà bị released sau khi closure task được performed.
• weak: Những trường hợp khác.

Những rule này để chống lỗi kinh điển EXC_BAD_ACCESS. Nếu bạn làm theo những rule này thì gần như bạn sẽ không gặp bất kì vấn đề về memory management

3. Extending object lifetime

Extend object lifetime bằng cách sử dụng the [weak self]guard let strongSelf = self else { return }. [weak self] được ưu tiên hơn [unowned self], nơi mà nó không cần phải xét ngay lập tức rằng nó sống lâu hơn closure. Explicitly extending lifetime được ưu tiên hơn là optional unwrapping. Xem ví dụ sau:

resource.request().onComplete { [weak self] response in
  guard let strongSelf = self else {
    return
  }
  let model = strongSelf.updateModel(response)
  strongSelf.updateUI(model)
}
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

29 bài viết.
14 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
Male avatar
4 3
RxSwift: Bài 1 Observable và Just, Of, From ===== 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 kipalo...
Bùi Khánh Duy viết 9 tháng trước
4 3
Male avatar
4 0
Autolayout và lifecycle trong IOS ===== 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 mớ...
Bùi Khánh Duy viết 7 tháng trước
4 0
Male avatar
2 3
RxSwift: Bài 2 Subscribing to 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ủa kipalog,...
Bùi Khánh Duy viết 9 tháng trước
2 3
Bài viết liên quan
White
11 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 3 năm trước
11 4
Male avatar
0 0
RxSwift: Bài 6: RxCocoa (Part 4) Units ===== 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ì...
Bùi Khánh Duy viết 9 tháng trước
0 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

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


Male avatar
{{userFollowed ? 'Following' : 'Follow'}}
29 bài viết.
14 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á!