Tôi nên xóa người quan sát ở đâu trong số NSNotification
trong Swift, vì viewDidUnload
và dealloc()
không khả dụng?Nơi xóa người quan sát cho NSNotification trong Swift?
Trả lời
Sử dụng phương thức dưới đây có chức năng giống như dealloc
.
deinit {
// Release all resources
// perform the deinitialization
}
Một deinitializer được gọi ngay trước một trường hợp lớp được deallocated. Bạn viết deinitializers với từ khóa deinit, tương tự như cách intializers được viết bằng từ khóa init. Deinitializers chỉ có sẵn trên các loại lớp.
Swift cung cấp một phương pháp deinit đó là kêu gọi các trường hợp của các lớp học trước khi họ bị phá hủy.
Bạn có thể sử dụng ba phương pháp:
1 - sau khi popViewController
, lưng navigationController
hoặc dismissViewControllerAnimated
:
deinit {
print("Remove NotificationCenter Deinit")
NSNotificationCenter.defaultCenter().removeObserver(self)
}
hoặc
2-viewDidDisappear
, loại bỏ sau khi nó đã được bộ điều khiển xem tiếp theo:
override func viewDidDisappear(animated: Bool) {
NSNotificationCenter.defaultCenter().removeObserver(self)
}
hoặc
3-viewWillDisappear
- trước khi mở xem tiếp theo:
override func viewWillDisappear(animated: Bool) {
NSNotificationCenter.defaultCenter().removeObserver(self)
}
Swift 3,0 cú pháp:
NotificationCenter.default.removeObserver(self)
Tính đến iOS 9 (và OS X 10.11), bạn không cần phải tự mình xóa các quan sát viên, nếu bạn không sử dụng các nhà quan sát dựa trên khối.
Hệ thống sẽ làm điều đó cho bạn vì nó sử dụng tham chiếu zero-yếu cho người quan sát, nơi có thể.
Thông tin khác có thể được tìm thấy tại Foundation Release Notes for OS X v10.11 and iOS 9.
Nếu người quan sát có thể được lưu trữ dưới dạng tham chiếu yếu zero, bộ nhớ cơ bản sẽ lưu trữ người quan sát dưới dạng tham chiếu yếu 0, nếu không thể lưu trữ đối tượng yếu (tức là nó có lưu giữ/giải phóng tùy chỉnh cơ chế đó sẽ ngăn chặn thời gian chạy từ việc có thể lưu trữ các đối tượng yếu ớt) nó sẽ lưu trữ đối tượng như là một tham chiếu zeroing không yếu. Điều này có nghĩa là các nhà quan sát không bắt buộc phải hủy đăng ký theo phương thức deallocation của họ.
Rất tuyệt! Tuyệt vời anwser! – allenlinli
Tôi cũng muốn chỉ ra rằng bạn nên sử dụng phương pháp này:
func addObserver(_ observer: Any, selector aSelector: Selector, name aName: NSNotification.Name?, object anObject: Any?)
Thay vì
func addObserver(forName name: NSNotification.Name?, object obj: Any?, queue: OperationQueue?, using block: @escaping (Notification) -> Void) -> NSObjectProtocol
Sau này sẽ không loại bỏ các quan sát viên (Ran vào vấn đề này thời gian gần đây). Trước đây sẽ xóa người quan sát nếu bạn đang sử dụng iOS9.
Khi nào thì người cũ đã loại bỏ người quan sát? – Shubham
@Shubham Kiểm tra [this out] (https://useyourloaf.com/blog/unregistering-nsnotificationcenter-observers-in-ios-9/) –
Nó cũng tốt nếu bạn thêm quan sát của bạn trong viewWillAppear()
và loại bỏ chúng trong viewWillDisappear()
- 1. Cảnh báo cho người dùng iOS/iPhone về các quan sát trùng lặp NSNotification
- 2. Thứ tự thông báo NSNotification của thông báo quan sát
- 3. Tôi nên xóa người quan sát thông báo ở đâu?
- 4. Polymer. Cách tự động thêm hoặc xóa người quan sát
- 5. Quan sát giá trị quan trọng trong Swift 4
- 6. Người quan sát thuộc tính Swift trong phần mở rộng giao thức?
- 7. Trả lại dữ liệu cho người điều phối từ người quan sát sự kiện trong Magento
- 8. Quan sát/Quan sát Android
- 9. Ghi đè người quan sát thuộc tính
- 10. Xóa người quan sát sau khi thay đổi giá trị trong Firebase
- 11. Xóa các ô khỏi UICollectionView qua NSNotification
- 12. Ngôn ngữ Swift: Cách xác định biến được tính toán với người quan sát?
- 13. Điều gì được coi là người quan sát trong Angular?
- 14. Nếu thêm người quan sát cho một thông báo trong AppDelegate, tôi có cần phải xóa nó đi không?
- 15. Quan sát tự trong Cocoa
- 16. iOS không thể xóa người quan sát Thông báo. Deinit không nhận được gọi
- 17. Thêm quan sát viên cho KVO mà không cần con trỏ sử dụng Swift
- 18. iOS KVO - Không thể loại bỏ một người quan sát
- 19. Di NSNotificationCenter quan sát
- 20. NSNotification chọn không được công nhận gửi đến dụ trong Swift
- 21. sáp nhập hai nhà quan sát thông báo trong RxSwift
- 22. Key-Value Quan sát trong Swift không hiển thị đặt và tháo trong mảng
- 23. .net Quan sát 'Quan sát' một chủ đề nền
- 24. KnockoutJS - Dải quan sát của các đối tượng quan sát
- 25. q.all cho các quan sát angular2
- 26. postNotificationName không gọi phương pháp quan sát
- 27. Trình quan sát AVPlayer trong Swift - đã nhận được tin nhắn nhưng không được xử lý
- 28. Quan sát duy nhất với nhiều người đăng ký
- 29. NSNotification là gì?
- 30. tương đương với quan sát cho `Promise.reject`
Tính đến iOS 9, theo một câu trả lời dưới đây, các quan sát viên sẽ được tự động xóa do bạn trừ khi bạn đang sử dụng những khối dựa trên. – Crashalot