Flow Synchronization이란?
- 상위 계층의 데이터를 하위 계층에 전달하여 데이터를 동기화하는 절차적 방법
- 장점: 서로 이웃해 있는 요소들끼리 데이터를 전달하므로 데이터 흐름 파악이 쉽다
- 이웃한 화면들끼리 데이터를 공유해야하는 경우 플로우 동기화가 효율적
ex01) UITableView
에서 Cell
을 탭했을 대 특정화면으로 이동하면서 해당 화면에 선택된 Cell
의 데이터를 동기화
ex02) 특정 UIViewController
를 push하고 있으면서 이동하는 화면으로 데이터를 넘겨줄 때
-단점: 동기화할 모든 요소들의 참조를 가지고 있어야하므로 참조 관리가 복잡해질 수도 있다
대표적인 Flow Sync: Notification Center
+---------------------+
| |
| UserProfileManager |
| |
+----------|----------+
|
| posts notification
| (userProfileUpdated)
|
v
+----------|---------------------------------+
| NotificationCenter |
+----------|---------------------------------+
|
| broadcasts to all observers
|
v
+----------|----------------------+ +------|--------------------+
| v | | v |
| ProfileViewController observes | | OtherComponent observes |
| and handles userProfileUpdated | | and handles userProfileUpdated |
+---------------------------------+ +---------------------------+
UserProfileManager
import Foundation
extension Notification.Name {
static let userProfileUpdated = Notification.Name("userProfileUpdated")
}
class UserProfileManager {
var userProfile: UserProfile {
didSet {
NotificationCenter.default.post(name: .userProfileUpdated, object: nil, userInfo: ["userProfile": userProfile])
}
}
}
Profile View
class ProfileViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(userProfileUpdated(_:)), name: .userProfileUpdated, object: nil)
}
@objc func userProfileUpdated(_ notification: Notification) {
if let userProfile = notification.userInfo?["userProfile"] as? UserProfile {
}
}
deinit {
NotificationCenter.default.removeObserver(self)
}
}
Profile Model
struct UserProfile {
var name: String
var email: String
}