Giới thiệu NSNotification & NSNotificationCenter trong iOS
Mở đầu: Trong cuộc sống, vấn đề giao tiếp vô cùng quan trọng và thiết yếu. Ngày ngày mỗi người chúng ta đều nhận thông tin và phản hồi thông tin cho người khác. Có thể là một một (giao tiếp trực tiếp) hoặc có thể là một nhiều (ví dụ như truyền hình). Trong lập trình cũng vậy, sẽ có những cách ...
Mở đầu:
Trong cuộc sống, vấn đề giao tiếp vô cùng quan trọng và thiết yếu. Ngày ngày mỗi người chúng ta đều nhận thông tin và phản hồi thông tin cho người khác. Có thể là một một (giao tiếp trực tiếp) hoặc có thể là một nhiều (ví dụ như truyền hình). Trong lập trình cũng vậy, sẽ có những cách thức để giao tiếp với các object với các đặc tính như sau: Trong bài viết này chúng ta sẽ cùng tìm hiểu về NSNotificationCenter & NSNotification.
NSNotificationCenter & NSNotification:
1. Cách thức hoạt động: Cung cấp một centralized hub để thông qua đó bất kỳ phần nào của một ứng dụng đều có thể thông báo cũng như nhận thông báo thay đổi từ cách phần khác của ứng dụng. Để thực hiện một action cụ thể khi có một event xảy ra thì cần đăng ký Observers với Notification center. Như vậy, mỗi khi event xảy ra, notification sẽ đi đến bảng điều khiển của nó và gửi message cho bất kỳ observers nào đã đăng ký với event đó. Các observers nhận được message sẽ thực hiện các action tương ứng. 2. Thành phần của NSNotification:
- Name: Tên của notification
- Object: Đối tượng liên quan đến notification
- UserInfo: Dictionary chứa thông tin liên quan tới notification
Ví dụ:
- UITextField posts một NSNotification với tên UITextFieldTextDidChangeNotification khi text changes
- UIKeyboardWillShowNotification: vị trí frame và animation timing được passed trong userinfo còn object = nil
Adding Observers
Cách 1:
NSNotificationCenter.defaultCenter().addObserver(observer: AnyObject, selector: Selector, name: String?, object: AnyObject?)
- observer: usually self
- selector: là một action (method) thực hiện khi nhận notification
Cách 2:
NSNotificationCenter.defaultCenter().addObserverForName(name: String?, object: AnyObject?, queue: NSOperationQueue?, usingBlock: (NSNotification) -> Void)
Thay vì đăng ký một existing object như một observer cho một notification. Thì method này tạo ra đối tượng nặc danh của observer, sẽ thực hiện khối lệnh trong queue (hay call thread nếu nil) khi matching với notification posted. Không giống như @selector, method này thực sự return về constructed observer object. name và object là 2 param quyết định sự matching giữa notification posted và observer.
- name != nil: Chỉ notifications với name này được trigger.
- name == nil: all names sẽ match.
Tương tự đối với object. Nếu cả 2 param name và object được set thì chỉ notifications với name và object đó được trigger. Còn nếu cả 2 là nil thì tất cả notification posted được trigger.
let center = NSNotificationCenter.defaultCenter() center.addObserverForName(nil, object: nil, queue: nil) { notification in print("(notification.name): (notification.userInfo ?? [:])") }
Removing Observers:
Việc này quan trọng cho objects loại bỏ observers trước khi chúng bị deallocated, để ngăn chặn các message được gửi đi. Có 2 method để remove observers:
NSNotificationCenter.defaultCenter().removeObserver(observer: AnyObjec)
và
NSNotificationCenter.defaultCenter().removeObserver(observer: AnyObject>, name: <String?, object: AnyObject?)
Posting Notifications
Có 3 methods posting notifications:
NSNotificationCenter.defaultCenter().postNotification(notification: NSNotification)
NSNotificationCenter.defaultCenter().postNotificationName(aName: String, object: AnyObject?)
NSNotificationCenter.defaultCenter().postNotificationName(aName: String, object: AnyObject?, userInfo: [NSObject : AnyObject]?)
Sự khác nhau giữa KVO và NSNotificationCenter:
Thỉnh thoảng cách developer còn lúng tung giữa Key-Value Observing và NSNotificationCenter nên cần phần biệt rõ để sử dụng tự tin hơn 2 phương pháp này.
Key-Value Observing: adds observers for keypaths
func addObserver(observer: NSObject, forKeyPath keyPath: String, options: NSKeyValueObservingOptions, context: UnsafeMutablePointer<Void>)
NSNotificationCenter: adds observers for notifications
func addObserver(observer: AnyObject, selector aSelector: Selector, name aName: String?, object anObject: AnyObject?) func addObserverForName(name: String?, object obj: AnyObject?, queue: NSOperationQueue?, usingBlock block: (NSNotification) -> Void) -> NSObjectProtocol
Kết luận:
Notifications là một công cụ thiết yếu để comunicate trong ứng dụng. Bởi các đặc tính phân bố, low-coupling, các notifications phù hợp với một loại các kiến trúc. Trên đây là bài giới thiệu về Notifications. Mong rằng nó giúp được cho các bạn. Thanks!