Hôm nay mình sẽ giới thiệu với các bạn các cách mà class giao tiếp với nhau trong lập trình iOS (Swift)
1. Notifications
Sử dụng Notifications khi các bạn có nhiều observers cần lắng nghe để cập nhật lại UI. Ví dụ bạn có 5 class load Data từ API khi có mạng, khi load xong chúng ta cần tín hiệu để update lại UI.
Cách khởi tạo và sử dụng Notifications:
Notifications thường chỉ được sử dụng để thông báo có dữ liệu mới cần cập nhật chứ không dùng để truyền dữ liệu (mặc dù có thể). Nếu cần truyền dữ liệu giữa các class bạn nên sử dụng phương pháp khác.
Ví dụ thực tế:
2. Delegation
Đây là phương thức mình sử dụng thường xuyên nhất để giao tiếp cũng như truyền dữ liệu giữa các class.
Để sử dụng Delegate trước tiên chúng ta cần tạo một protocol:
protocol ModelDelegate: class {
func didReceiveData(_ data: String)
}
Ở class giữ delegate ta tạo biến weak reference có kiểu là ModelDelegate:
class Model {
weak var delegate: ModelDelegate?
func downloadData() {
let data = "Network request information."
delegate?.didReceiveData(data)
}
}
Bây giờ chúng ta đã có thể sử dụng delegate từ class Model. Ở đây mình sẽ sử dụng ở ViewController:
class ViewController: UIViewController {
let model = Model()
override func viewDidLoad() {
super.viewDidLoad()
model.delegate = self
model.downloadData()
}
}
extension ViewController: ModelDelegate {
func didReceiveData(_ data: String) {
print(data)
}
}
Mình sẽ khởi tạo model sau đó set model.delegate = self và implement protocol ModelDelegate, khi mà model download dữ liệu xong sẽ chạy hàm này và nhận một dữ liệu kiểu String.
3. Callbacks
Callbacks tương tự như Delegate nhưng việc khởi tạo và sử dụng đơn giản hơn.
Ví dụ: ở class View có một function chạy animation, khi animation chạy xong ta cần báo cho ViewController biết để chạy một đoạn code khác.
class View {
func runAnimation(completion: @escaping() -> ()) {
//run animation, upon completion send callback
completion()
}
}
Ở ViewController ta cần khởi tạo View và chạy hàm animation:
Các bạn cũng có thể dùng Callback để truyền dữ liệu giữa 2 class:
Lưu ý: khi sử dụng Callback các bạn phải sử dụng [weak self] trong closure để tránh việc retain cycles gây leak memory. Nếu không sử dụng [weak self] thì ở đây sẽ có một tham chiếu mạnh [strong self] tới ViewController dẫn đến việc ViewController sẽ không được dealloc.
Cám ơn các bạn đã theo dõi bài viết.