#7 Sử dụng NotificationCenter như thế nào trong Swift 4?

Với một NotificationCenter bạn có thể phát sóng dữ liệu từ một phần của app đến những phần nơi khác của app. Nó sử dụng Observer pattern để thông báo cho những người đã đăng ký quan sát khi có thông báo đến, sử dụng một điều phối trung tâm gọi là Notification Center.

Trong bài viết này chúng ta sẽ tìm hiểu cơ chế làm việc của Notification Center như thế nào và cách bạn sử dụng nó trong ứng dụng của mình. Notification Center đặc biết hữu ích để nhận dữ liệu từ một phần của ứng dụng sang một phần khác của ứng dụng.

Trước khi bắt đầu, có một vài lưu ý như sau:

  • NotificationCenter thường được nhắc đến như NSNotificationCenter với tiền tố “NS” ở Swift 3. Bạn sẽ thấy mọi người gọi nó là NSNotificationCenter
  • Cơ chế của NotificationCenter không liên quan gì tới đến push notification hoặc Notification Center UI
  • Hướng dẫn này chủ yếu tập trung vào sử dụng NotificationCenter  để gửi chương trình phát sóng trong app bằng Swift 4.

NotificationCenter làm việc như thế nào?

Chúng ta bắt đầu với việc NotificationCenter làm việc chính xác như thế nào, nó gồm 3 phần.

  • Một “listener” để lắng nghe các thông báo được gọi là Observer
  • Một “sender” để gửi các thông báo khi có chuyện gì đó xảy ra
  • Trung tâm thông báo, theo dõi các nhà qua sát (Observers) và thông báo.

Cơ chế này rất đơn giản, hãy cùng xem xét sự việc tương tự:

  • Bạn đang làm việc ở một cơ sở xử lý thư để cung cấp thư cho 5 đường phố sắc màu.
  • Bạn – người đưa thư, cần cung cấp thư màu tím đến phố màu tím bất cứ khi nào nó đến cơ sở xử lý thư.
  • Khi sự dịch chuyển của bạn bắt đầu, bạn nói với trung tâm lệnh của cơ sở thư – hãy gọi cho Bob – bạn muốn biết khi nào thư màu tím sẽ tới.
  • Thời gian qua đi, Alice ở phố màu vàng muốn gửi một thư đến đường phố màu tím
  • Do vậy, cô ấy gửi bức thư của cô ấy đến cơ sở thư, và sẽ được Bob sẽ chọn bức thư ở trung tâm lệnh và thông báo cho bạn biết có thư màu tím đến
  • Bạn nhận thư màu tím và gửi an toàn đến đường phố màu tím.

Điều tuyệt vời của cơ chế này là Bob và Alice không cần phải biết nhau họ chỉ cần biết đến trung tâm lệnh là NotificationCenter

Vì thế, NotificationCenter có thế sử lý một-nhiều hoặc nhiều-nhiều giao tiếp.Alice có thế gửi đồ cho Bob, Arthur cũng có thế gửi đồ cho Bob, nếu Alice đang lắng nghe thì Bob và Arthur cũng có thế gửi đồ cho Alice.

Đây là tổng quan về cơ chế của NotificationCenter:

 

Đây là chuyện gì xảy ra:

  1. Phần B nói với NotificationCenter rằng nó muốn quan sát một thông báo với addObserver(_:selector:name:object:)
  2. Những thứ xảy ra trong phần A, như dữ liệu đến hoặc công việc hoàn thành
  3. Phần A sẽ tạo và đăng một thông báo lên NotificationCenter
  4. NotificationCenter sẽ thông báo cho phần B rằng một thông báo mà nó quan sát đã được đăng bằng cách gọi một selector ở phần B.
  5. Một selector sẽ được gọi, và thực thi hiệu quả chức năng ở phần B

Phần A và B có thể là bất cứ kiểu class nào, có thể là tùy chỉnh API class hoặc data model

Đăng ký quan sát thông báo như thế nào?

Đây là cách bạn đăng ký

NotificationCenter.default.addObserver(self, selector: #selector(onDidReceiveData(_:)), name: .didReceiveData, object: nil)

Điều này thêm một entry đến NotificationCenter, về cơ bản nó với nó rằng “self” muốn quan sát những thông báo với tên là “.didReceiveData”, khi có thông báo xảy ra thì function onDidReceiveData(_🙂 sẽ được gọi.

Function addObserver(_:selector:name:object:) có 4 đối số truyền vào:

  • Tham số đầu tiên thường không được đặt tên, bạn cung cấp nó tham chiếu đến đối tượng quan sát thông báo này thường là self
  • Tham số selector thứ 2 là function bạn muốn gọi khi có thông báo xảy ra, nó làm việc giống action-target pattern.
  • Tham số name thứ 3 là tên của thông báo mà bạn muốn lắng nghe, nó là kiếu Notification.Name
  • Tham số object thứ 4 là đối tượng không bắt buộc, người mà bạn muộn nhận những thông báo, nếu bạn cài đặt nó thì bạn chỉ có thế nhận được thông báo từ “sender” đó

Function bạn muốn gọi khi một thông báo được quán sát.

@objc func onDidReceiveData(_ notification:Notification) { // Do something now }

Function có một tham số, nó được gọi là Notification. Bạn sẽ thấy sau này bạn có thể sử dụng thuộc tính userInfo để gửi một số dữ liệu với thông báo

Mọi thông báo có một cái tên với kiểu Notification.Name. Bạn có thể tạo như sau:

let name = Notification.Name(“didReceiveData”)

Tiện lợi hơn nếu bạn thêm tên thông báo của mình vào static constant extension của Notification.Name:

extension Notification.Name {

static let didReceiveData = Notification.Name(“didReceiveData”)

static let didCompleteTask = Notification.Name(“didCompleteTask”)

static let completedLengthyDownload = Notification.Name(“completedLengthyDownload”)

}

Tên thông báo bây giờ đã sẵn sàng như static constant kiểu Notification.Name. Do vậy bạn có thế sử dụng cú pháp:

NotificationCenter.default.addObserver(self, selector: [selector], name: .didCompleteTask, object: nil)

Thông tường bạn có thể đăng ký và xóa các quan sát viên (observer) ở:

  • viewDidLoad() và dealloc, hoặc
  • viewWillAppear(_:) and viewWillDisappear(_:)

Bạn có thể xóa người qua sát với removeObserver(_:name:object:) và sử dụng chính xác các tham số như addObserver(…)

Đăng một thông báo như thế nào?

Bây giờ chúng ta quan sát một thông báo và cùng đăng nó.

NotificationCenter.default.postNotification(name: .didReceiveData, object: nil, userInfo: nil)

Trong function trên có 3 tham số:

  • Tham số đầu tiên là name, nó chính xác giống như tên thông báo mà bạn đang quan sát
  • Tham số thứ 2 là object, là sender của thông báo, bạn có thể truyền vào nil, mục đích của đối số này là giống với ở addObserver(…) , bạn có thể sử dụng nó để lọc các thông báo
  • Tham số thứ 3 là userInfo, mục đích của tham số này là truyền vào dữ liệu để những nơi bạn đang quan nhận được dữ liệu.

Sử dụng NotificationCenter cho những trường hơp nào?

  1. Khi giao tiếp giữa hai hoặc nhiều thành phần của ứng dụng của bạn, không có kết nối chính thức, cần phải xảy ra
  2. Khi giao tiếp xảy ra nhiều lần và nhất quán
  3. Khi giao tiếp sử dụng cho một-nhiều hoặc nhiều-nhiều

Nguồn bài viết

Bình luận về bài viết này