Delegate, Key value observing, Notifications through Notification Center
Một trong những việc mà chúng ta thường xuyên gặp phải trong việc developing IOS applications đó là việc giao tiếp giữa các View Controller (các màn hình của một ứng dụng). Có 3 parten phổ biến nhất mà chúng ta hay gặp đó là :
- Delegate
- Notification Center
- KVO ( Key value observing)
Trong bài viết này mình sẽ chia sẻ cho các bạn các ưu nhược điểm của từng cách và từ đó sẽ có cái nhìn tổng quan hơn về các cách giao tiếp giữa các View Controller và cách cấu trúc code cho đẹp tránh code tầm bậy, nhiều param gây náo loạn source code, nhìn vào chỉ muốn đấm vào mặt,,
Ok, let go….
Delegation
Trong lập trình IOS delegate được sử dụng khá nhiều, dùng trong nhiều mục đích khác nhau. Một số mục đích như : truyền data giữa các ViewController, UIView, Cell, updateView, chuyển qua các màn hình khác nhau.
Ưu điểm:
- Hiển thị error, warning trong quá trình code.
- Protocol được định nghĩa trong phạm vi của ViewController, UIView, Cell đó.
- Dễ dàng hình dung ra được flow của của ứng dụng.
- Có thể define được nhiều delegate với nhiều các chức năng khác nhau.
- Không cần third party
- Cung cấp thông tin khi back về ViewController.
Nhược điểm:
- Cần nhiều dòng code cần được define:
1. define protocol
2. define delegate in view controller.
3. implement method protocol on another view controller - Có thể gây ra memory leak nếu không quản lý tốt.
Notification Center
Notification Center là một singleton object cho phép nhận notification khi có một sự kiện được diễn ra. Được dùng để giao tiếp giữa các ViewController, pass data nhận từ ReceiveNotificationFromServer ( userInfo: Dictionnary).
Ưu điểm:
- Implement dễ dàng, không quá nhiều dòng code như delegate
- Có thể custom userInfo: [AnyHashable : Any], pass tới viewController
Nhược điểm:
- Không compile time được trong quá trình code, nên có thể gây crash app.
- Yêu cầu un-register khi object deallocated.
- Gặp nhiều khó khăn khi có issue
- No ability for the controller to get any information back from an observer after a notification is posted. ( link )
Observation
Key value observing (KVO) is a pattern in which one object can observe the value of another object’s properties to find out about changes. Delegate và NotificationCenter thì thích hợp với việc giao tiếp với các object, còn KVO thì nó thiên về lắng nghe khi có sự thay đổi value so với value ban đầu. Đây là cách mà làm cho một object có đô react khi mà có sự thay đổi. Nó không những dùng cho các properties mà còn là các response từ các phương thức, các action khác nhau.
Ưu điểm:
- Làm đồng bộ dữ liệu giữa 2 object. Ex: View và Model.
- Có thể lấy được new value và old value khi đang observe
- Có thể dùng #keyPath để observe properties nên các nested object có thể observe.
Nhược điểm:
- Các properties muốn được observe thì phải được define kiểu dự liệu String.
- Khi properties bị thay đổi, thì có thể bị mất observe
- Cần phải remove observe khi bị deallocated.
Tổng quan:
Trên đây là 3 cách mà mình đã được gặp và đụng làm tới nó, dùng nhiều nhất là Delegate chủ yếu là để giao tiếp giữa các UView, UITableViewCell, với ViewController. NotificationCenter dùng post một hành động nào đó, khi nhận được thông tin từ servers,… KVO thì dùng trong trường hợp khi chúng ta tạo một object và muốn nhận biết được sự thay đổi của nó khi đi qua các ViewController khác nhau.
Ref: Bài viết gốc