๋ค์ด๊ฐ๋ฉฐ
Notification์ ๊ฐ, ๋ฐ์ดํฐ ์ ๋ฌํ ๋ ์ ๋ง ์ ์ฉํ ๋
์์ด๋ค. ์ด๋ป๊ฒ ๋ณด๋ฉด ์ฌ์ฉ ๋ฐฉ๋ฒ๋ ๋๊ฒ ๋จ์ํ๋ฐ ์จ์ผ ํ ์ฝ๋๊ฐ ๊ณณ๊ณณ์ ํผ์ ธ์๊ณ , ๋ง์ด ์ฐ๋ค๋ณด๋ฉด ๊ด๋ฆฌ๊ฐ ์ด๋ ค์์ง๋ค. ์ ์ ํ ๋ ์ฐ๋ฉด ์ฐธ ์ข์ ์น๊ตฌ... (ํนํ ๊ณ์ธต์ด ๋ณต์กํ ๋ ์ฐ๋ฉด ๊ฟ์ด๋ค ๐ฏ) ์ค๋ ๊ทธ๋์ ๋จ์ํ๊ฒ ์ฅ์ ์ค๋ช
ํ๋ ค๊ณ ๊ธ์ ์ฐ๊ฒ ๋ ๊ฒ์ ์๋๊ณ , ๋ถํธํ๋ ์ ์ ๊ฐ์ ํด ๋ณธ ๊ฒ์ ๊ธฐ๋กํ๊ณ ์ ํ๋ค.
(์ ๊ทธ๋ฆฌ๊ณ ๊ธ ์ฐ๋ค ๋ณด๋ฉด ๋งํฌ๊ฐ ์ ๋ง ์ค๋ฝ๊ฐ๋ฝ ํ๋ฐ ์ดํดํด์ฃผ์๊ธธ ... ๊ธ ์ข ๋ ์จ๋ณด๊ณ ํ ๊ฐ์ง๋ก ์ ์ฐฉํด์ผ๊ฒ ๋ค.)
๋ถํธํ๋ ์
๋ถํธํ๋ ์ ์ Notification.Name ์์ ๋ค์ด๊ฐ๋ ๋ฌธ์์ด์ post ํ๋ ์ชฝ๊ณผ addObserving ํ๋ ์ชฝ์ ์ ํํ ๋ง์ถฐ์ฃผ์ด์ผ ํ๋ค๋ ์ ์ด๋ค. ํด๋จผ์๋ฌ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ๋๊ณ , ์ฝ๋๊ฐ ๊ณณ๊ณณ์ ํผ์ ธ์์ผ๋ฉด ์ ๋ง ์ฐพ์๋ณด๊ธฐ ์ด๋ ต๋ค. ๊ทธ๋ฆฌ๊ณ ์๊ฐ๋ณด๋ค ์ฝ๋ ๋ผ์ธ ์๊ฐ ์ข ๋ง์์ง๊ณ , post ยท addObserver ยท removeObserver ยท ๊ทธ๋ฆฌ๊ณ ์ก์
์ ์คํํ๋ ํจ์(๊ฐ์ ๋ฐ์์ ์ฌ์ฉํ ์๋ ์์) ์ด๋ ๊ฒ ์์ฑํด์ผ ํ๋ ํํธ๊ฐ ์ฐธ ๋ง๋ค.
์ฐธ ์ข์๋ฐ ๊ท์ฐฎ๋ค๋ ๊ฒ์ด๋ค. ๊ทธ๋์ ์ฒ์์๋ Property Wrapper๋ก ์ด์ฐ ํด๋ณด๋ ค๋ค๊ฐ ๊ตณ์ด ๊ทธ๋ ๊ฒ๊น์ง ๋ณต์กํ๊ฒ Wrapping์ ์ํด๋ ๋ ๊ฒ ๊ฐ์๋ค. ์ฐพ์๋ณด๋ ๋๋ฆ ๋ผ์ธ ์๋ฅผ ์ค์ด๋ฉด์ ํธ๋ฆฌํ๊ฒ ๊ด๋ฆฌํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ฐพ์์ ๊ธฐ๋กํ๊ณ ์ ํ๋ค.
์์
๊ฐ๋จํ๊ฒ ์ญ๋ฐฉํฅ์ผ๋ก ๊ฐ์ ์ ๋ฌํ๋ ์์์ด๋ค.
์ฝ๋ ๊ฐ์
extension Notification.Name {
static let test = Notification.Name("test")
}
์ด๋ ๊ฒ Notification.Name์ Extension์ผ๋ก Key๊ฐ์ ๊ด๋ฆฌํ๋ ๊ฑด ๋ง์ด ์๊ณ ์๋ ์ฌ์ค์ด๋ค. ๋ฆฌํฐ๋ดํ ๊ฐ์ ๊ด๋ฆฌํ๊ธฐ๋ ์ข์ง๋ง ์ฌ์ ํ ์์ฑํด์ผ ํ๋์ฝ๋๊ฐ ๋ง๋ค. ๊ท์ฐฎ๋ค..๐
extension Notification.Name {
func post(object: Any? = nil, userInfo: [AnyHashable : Any]? = nil) {
print("โ๏ธ ใฐใฐใฐใฐใฐใฐใฐ post (์ ํธ ์์ด์!!)")
NotificationCenter.default.post(name: self, object: object, userInfo: userInfo)
}
@discardableResult
func addObserver(object: Any? = nil, queue: OperationQueue? = nil, using: @escaping (Notification) -> Void) -> NSObjectProtocol {
print("๐ ใฐใฐใฐใฐใฐใฐใฐ addObserver (์ต์ ๋ฒ ๋ฑ๋ก!!)")
return NotificationCenter.default.addObserver(forName: self, object: object, queue: queue, using: using)
}
func removeObserver(observer: Any, object: Any? = nil) {
print("โ๏ธ ใฐใฐใฐใฐใฐใฐใฐ removeObserver (์ต์ ๋ฒ ๋ฑ๋ก ํด์ !!)")
return NotificationCenter.default.removeObserver(observer, name: self, object: object)
}
}
๊ทธ๋์ ์ด๋ ๊ฒ ๋ฉ์๋๋ฅผ ์ถ๊ฐ๋ก ๋ง๋ค์ด์ค๋ค. ํค ๊ฐ์ ๋ฐ๋ผ์ Notification.Name ๊ฐ์ post, addObserver์ ๊ทธ๋๋ก ์ด์ฉํ์๋ ๊ฒ์ด๋ค.
1๏ธโฃ Post
// ์
NotificationCenter.default.post(
name: Notification.Name("test"),
object: nil,
userInfo: ["message": messageTextField.text!]
)
// ํ
Notification.Name.test.post(object: nil, userInfo: ["message": messageTextField.text!])
๋๋ ํ์๊ฐ ๋ ๊น๋ํ๊ณ ์ฌ์ฉํ๊ธฐ ํธํ๋ค๊ณ ๋๊ผ๋ค.
2๏ธโฃ addObserver
// ์
NotificationCenter.default.addObserver(
self,
selector: #selector(testObserver),
name: Notification.Name("test"),
object: nil
)
@objc func testObserver(_ notification: NSNotification) {
if let message = notification.userInfo?["message"] as? String {
self.overviewLabel.text = message
}
}
// ํ
Notification.Name.test.addObserver { [weak self] noti in
print("====================================")
print("๐ฉ ใฐใฐใฐใฐใฐใฐใฐ ๊ตฌ๋
(๋ฉ์์ง) ์๋ฆผ ์์ด์์")
print("====================================")
guard let self = self else { return }
self.overviewLabel.text = noti.userInfo?["message"] as? String
}
print๋ฌธ์ ํฌํจํ๊ณ ๋ณด๋๋ผ๋ ํ์๊ฐ ํจ์ฌ ๊ฐ๋จํด๋ณด์ธ๋ค. ํด๋ก์ ๋ฅผ ํตํด ์ด์ด์ ๋ฐ๋ก ๋์์ ์ํํ๊ฒ ๋๋ค. ๊ฐ์ ์ ํด๋ณด๋ฉด์ ํธ๋ฆฌํจ์ ๋๊ผ๋ค. ๋ฌผ๋ก ์ค์ํ ๊ฑด ์ฝ๋๋ฅผ ์ผ๋ง๋ ๊น๋ํ๊ฒ ์ฐ๋๋ณด๋ค ์ ์ฌ์ ์์ ์ฌ๋ฐ๋ฅธ ์ฝ๋๋ฅผ ์ธ ์ ์๋๊ฐ ์๋๊น ์ถ๋ค.
ํน์ ์๋ชป๋ ๋ด์ฉ์ด๋ ์ด์ํ ์ ์ด ์๋ค๋ฉด ์ธ์ ๋ ์ง ๋ต๊ธ์ ๋ฌ์์ฃผ์ธ์!