RxSwift: Bài 6: RxCocoa (Part 5) - Disposing with RxCocoa
RxSwift: Bài 6: RxCocoa (Part 5) - Disposing with RxCocoa 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 ...
RxSwift: Bài 6: RxCocoa (Part 5) - Disposing with RxCocoa
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
Mở rộng đối tượng sử dụng bằng cách sử dụng [yếu tự] và bảo vệ để cho StrongSelf = self else {return} thành ngữ. [tự ngã yếu đuối] được ưa chuộng hơn [unowned self], nơi nó không phải là ngay lập tức hiển nhiên rằng bản thân sống lâu hơn sự đóng cửa. Ưu tiên kéo dài tuổi thọ được mở rộng tùy chọn.
Extend object lifetime bằng cách sử dụng the [weak self] và 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) }