**์ฃผ์ : ํน์ ์ฝ์ง๋ง ๋๊น์ง ์๋ณด์๋ ๋ถ๋ค์ ์ ์ฉํ๊ณ `์ต์ ๋ฒ ์ ๊ฑฐ` ๊ฒ์ํด์ ๊ผญ ์ ๊ฑฐํด์ฃผ์ธ์.**
์ค๋ ํฌ์คํ ์ฃผ์ ๋ Notification Center.
Swift๋ฅผ ์ฌ์ฉํ๋ฉด์ ์ฌ์ฉํ์ ์ด ์์๋๊ฒ ๊ฐ์์ ๋ฐฐ์ฐ๋๊น์ ๊ธ๋ก ํฌ์คํ ์ผ๋ก!!!
ํ์ง๋ง, ์์ง๋ ์ ๋ง ์ด๋ ์จ์ผํด!! ๋ผ๋๊ฑด ์๋ชจ๋ฅด๊ฒ ๋คโฆ ์ด๋ฐ ๊ฒฝ์ฐ์ ์ด๊ฑธ ์ธ์์๊ฒ ๋ค ์ ๋ ๋๋โฆ?
๋ง์น if๋ฌธ ๋ฐฐ์ด์ํ์ guard๋ฌธ์ ์๊ฒ๋ ๋๋โฆ
๊ฐ๋จํ ๊ฐ๋ ์ ๋ถํฐ ์ ๊ทผ์ ํ์๋ฉด
๋ฐฐ์ฐ๊ณ ๋ ๋๋
๋๋์ ์ด๋ฌ๋ค
ย <๋ฌด์ธ๊ฐ ์ก์
์ด ์์์ ๋,>์ด ์ก์
์ด ์งํ๋์์ผ๋ ๋ด๋น์๋ค์ ์ฒ๋ฆฌ๋ฐ๋.
ย ๋ด๋น์ ์์ ์๋ฃ, ์ฒ๋ฆฌํ๊ฒ ์ย
์ด๋ฐ ๋๋??
์ฑ์์ ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฐ๋ฅํ ๊ฒ ๊ฐ์๋ค
ํ๋ฉด์ด ๋ฐฑ๊ทธ๋ผ์ด๋์ ๋ค์ด๊ฐ์๋, VC์ ์ด๋ ํ ์ฒ๋ฆฌ๋ฅผ ํ๊ณ ์ถ๋ค.
์ฌ๋ฌ VC์ ์ํฅ์ ์ฃผ๊ณ ์ถ๋ค.
๋ณดํต์ ๊ฒฝ์ฐ ๊ฐ์ ํด๋์ค ๋ด์ ๋ฉ์๋๋ ํ๋กํผํฐ๋ค์ด ์๋๋ฉด ์ ๊ทผํ๊ธฐ๊ฐ ๊นํ์ค๋ฌ์ ๋๊ฒ ๊ฐ๋ค.
๋ธ๋ฆฌ๊ฒ์ดํธ ํจํด์ ์ด๋ค๊ฑฐ๋ ํ๋กํ ์ฝ์ ์ฌ์ฉํด์ ์ ๊ทผ์ ํ๊ฒ๋์ง๋ง Notification Center
๋ก๋ ๊ฐ๋ฅํ๋จ๊ฑธ ์๊ฒ ๋์๋ค.
ํ์ง๋ง, ๋จ์ ๊ฐ์ ๋ฌ์ด๋ผ๋๊ฐ, ๋ธ๋ฆฌ๊ฒ์ดํธ ํจํด, ํ๋กํ ์ฝ์ด ์ฌ์ฉํ๊ธฐ ๋๊ฐํ ์ํฉ์ด ์๋์ด์ Noti Center๋ ์์ธ๋ฏํ๋ค.
์ข๋ ์ฌ๋ฌ๊ณณ์ ๋์๋ค๋ฐ์ ์ผ๋ก ์๋ฆฌ๋๊ฒ ๊ฐ๋ฅํ๊ฒ ๋ค๋ ์๊ฐ์ด ๋ค๋ฉด์
์ฑ ๋ค์ด ์ ๋ฐฉ์ก๊ตญ์ ์์๋ฅผ ๋๋์ง ์กฐ๊ธ ์ดํด๊ฐ ๋๋ค.
์ฌ์ฉ๋ฒ
๋ฐฉ์ก๊ตญ์ด๋ค ๋ญ๋คํด๋ ์ฒจ์ ๋ ์ดํด๊ฐ ์๋์๊ธฐ์ ๊ทธ๋ฐ ์ค๋ช ์ ์๋ต
<๋ฌด์ธ๊ฐ ์ก์
์ด ์์์ ๋,>์ด ์ก์
์ด ์งํ๋์์ผ๋ ๋ด๋น์๋ค์ ์ฒ๋ฆฌ๋ฐ๋.
๋ด๋น์ ์์ ์๋ฃ, ์ฒ๋ฆฌํ๊ฒ ์
์ด๋ ๊ฒ ์ด ์ด์ ๊ฐ ์๋ค. ์ฝ๋ ๋์์ ํ์ด์ด๊ฒ์ด์๋ค.
Post - โ์ด ์ก์ ์ด ์งํ๋์์ผ๋ ๋ด๋น์๋ค์ ์ฒ๋ฆฌ๋ฐ๋โ
์ฐ์ <๋ฌด์ธ๊ฐ ์ก์
์ด ์์์ ๋,>์ด ์ก์
์ด ์งํ๋์์ผ๋ ๋ด๋น์๋ค์ ์ฒ๋ฆฌ๋ฐ๋.
๋ ๋ค์๊ณผ ๊ฐ๋ค.
// doItSomeThing์ ํด๋น ๋๋ ๊ฒ๋ค์ ์ฒ๋ฆฌ ๋ฐ๋
NotificationCenter.default.post(name: .doItSomeThing, object: nil)
์ค์ - post
๋์ค ์ค๋ช
- .doItSomeTing
, object
์ฐธ๊ณ ๋ก
.doItSomeThing
์ ์๋ ์กด์ฌํ๋๊ฒ ์๋๊ณ ๋ด๊ฐ ์์ฑํ ํ๋กํผํฐ,์๋์์ ์ค๋ช !
ํฌ์คํธ๋ผ๋ ๋จ์ด๊ฐ ์ค์ํ๋ค.๋ญ๊ฐ ๋ณด๋ด๋ ๊ทธ๋ฐ ์๋ฏธ๋, ์ฌ๊ธฐ์ name
์ ํด๋น์๋ค์๊ฒ ๊ฐ์ ์ผ์ ์ํํ๋ผ๊ณ ์คํ์ํค๋ ๊ฒ์ด๋ผ ์๊ฐํ๋๊ฒ ๋ง๋๊ฒ ๊ฐ๋ค.
๊ทธ๋ผ ์คํํ๋ผ ๋ช ๋ นํ์ผ๋ ๋ช ๋ น ๋ฐ์ ์ ๋ค์ด ํ์ํ๋ค.
๋ค์ ํน์ดํ ๊ฐ๋
์ด ๋์จ๋ค. doItSomeThing
์ ์ ๋ง name์ ํด๋น๋๋ค. ๋ฌด์จ ๋์ํ๋๊ฒ ์๋๋ค.
name
์ ์ผ ์ฒ๋ฆฌํ๋ ์คํ
์ ์ด๋ฆ์ด๋ผ ์๊ฐํด์ผํ๋ค.
์คํ ๋ง๋ค ๊ฐ์์ ์ผ๊ฑฐ๋ฆฌ๋ ๋ค๋ฅด๋ค.
๊ทธ๋ ๋ด, ์ผ๊ฑฐ๋ฆฌ์ ์ด๋ฆ์ ์ ํ ์ ํ์.
์ผ๋จ ์ผ๊ฑฐ๋ฆฌ ํ๋ ๋ง๋ ๋ค. ( = ๋์ํ ํจ์ ์์ฑ )
@objc func printSomeThing(_ notification: Notification) {
print("do it something")
}
๊ฐ๋จํ๋ค. ํ๋์ผ์ ๊ทธ์ print ํ๋ฒ ํด์ฃผ๋๊ฒ๋ฟ.
๋์ฌ๊ฒจ๋ณผ๊ฑฐ๋ผ๋ฉด ํ๋ผ๋ฏธํฐ ํ์
์ด Notification
์ด๋ผ๋ ์ ๋???
@objc ๋ถ์ ์ด์ ๋ NotificationCenter๊ฐ ์๋๋ NSNotificationCenter๋ค. Swift ๋ช์ธ์ง ๊ธฐ์ต์ ์๋์ง๋ง ์ด๋ฆ์ด ๋ฐ๋์๋ค. Objective-c ์์ ์ฐ์ด๋๊ฑฐ๋ ๋ถ์ฌ์ฃผ์
Observer - โ๋ด๋น์ ์์ ์๋ฃ, ์ฒ๋ฆฌํ๊ฒ ์โ
observer = ๊ด์ฐฐ์, ์ฌ๊ธฐ์ ์ผํ๋ ์คํ (๋ด๋น์)์ด๋ผ ์๊ฐํ์, ์คํ ๋ค ์ ๋ฌด ์ง์ ์ ๋?
// ๋ด๋น์ ์ธ์ ์ฌํญ ๋ฐ ์
๋ฌด ์ถ๊ฐ
NotificationCenter.default.addObserver(self, selector: #selector(printSomeThing(_:)), name: .doItSomeThing, object: nil)
์ค์ - addObserver
, selector
, name
addObserver
- ๊ด์ฐฐ์๋ฅผ ๋๊ธฐ์ํค๊ฒ ๋ค๋ ๊ฒ,
selector
- ์คํ
ํ ์
๋ฌด
name
- ์คํ
ํ ์ด๋ฆ
์ฌ๊ธฐ์ ๊ฐ์ฅ ์ค์ํ๊ฑด ์ด๋ฆ์ด๋ผ ์๊ฐํ๋ค. Post ๋ฉ์๋๊ฐ name
์ โ๋๊ตฌ์จ ์ผํด!!โ ๋ผ๊ณ ํ๋ค๋ฉด, ๊ทธ ์ด๋ฆ์ ํด๋น ๋๋ ์คํ
๋ค์ด ๊ฐ์ ๋ฑ๋ก๋ ์
๋ฌด (= selector
) ์ํํ๊ฒ ๋๋ค. ์ด ์ฝ๋์์ .doItSomeTing
์ ๋ถ๋ฅด๋ฉด ์๊น ๋ง๋ ํจ์(print ํ์ค์ง๋ฆฌ)๋ฅผ ์คํํ๊ฒ ๋๋ค.
์คํ ์ด๋ฆ์ ์ค๋ณต๊ฐ๋ฅํ๋ค, ๋ค๋ฅธ addObserver๋ฅผ ์์ฑํด๋ ์ด๋ฏธ ์ฌ์ฉํ ์ด๋ฆ์ ์ธ์์๋ค.
์ด๋ด๊ฒฝ์ฐ ๋ง์ง๋ง๋ง์ด ์๋ ํด๋น ์ด๋ฆ ๋ชจ๋ ์คํ๋จ.
name ๋ฑ๋ก ๋ฐฉ์
๊ทธ๋ผ ์ฌ์ฌ ์ด๋ฆ ์ถ๊ฐ๋ฐฉ๋ฒ์ ๋ํด ์ฐ๋๊ฒ ๋ง๋๊ฒ ๊ฐ๋ค.
2๊ฐ์ง ์ ๋๊ฐ ์๋ค.
1) addObserverํ ๋ ํ๋ฒ์
// Post
NotificationCenter.default.post(name: Notification.Name("doItSomeThing"), object: nil)
// Add Observer
NotificationCenter.default.addObserver(self, selector: #selector(printSomeThing(_:)), name: Notification.Name("doItSomeThing"), object: nil)
์ด๋ ๊ฒ โdoItSomeThingโ ์ด๋ผ๋ Notification.Name ๋ฐ์ดํฐ ํ์ ์ ๋ง๋ค์๋ ์์ง๋ง
๋ณ๋ก ์ถ์ฒํ๊ณ ์ถ์ง ์๋ค. ์ฌ์ฌ์ฉ๋ ํ๋ค๊ณ ์ฝ๋๋ ์๊น๋
2) Extension์ผ๋ก ํ๋กํผํฐ ์ถ๊ฐ
extension Notification.Name {
static let doItSomeThing = Notification.Name("doItSomeThing")
}
์ด๋ ๊ฒ Notification.Name
์ ํ๋กํผํฐ๋ฅผ ์ถ๊ฐํด์ฃผ๋ฉด,
์ ์ฝ๋๋ค์ ๋์ค๋ฏ name
์๋ฆฌ์ ์๋ .doItSomeThing
์ ์ธ์ ์๊ธฐ์
๊น๋ํ๊ณ ์ฌ์ฉํ๊ธฐ๋ ์์ํด์ง๋ค.
์์
์ด๋ฐ์์ผ๋ก ์ฌ์ฉ๊ฐ๋ฅํ๋ค
ex) ํ๋ฉด์ด VC1 -> VC2 -> VC3 ์ด๋ ๊ฒ ์๋ค๊ณ ์น์, ๊ทธ๋ฆฌ๊ณ ๊ฐ๊ฐ Label์ 1๊ฐ์ฉ ๊ฐ์ง๊ณ ์๋ค.
๋ค๋น๊ฒ์ด์ ์ ์ด์ฉํ ๊ฒ์ด๋ฉฐ, ํ๋ฉด ์ด๋๋ ์์ ๊ฐ๋ค. ๊ทธ๋ฆผ์ผ๋ก ์ดํด๋์๋ฉด ์ด์ ๋?
๊ทธ๋ฆฌ๊ณ ๊ทธ 3์๋ ๋ฒํผ์ด ํ๋ ์๊ณ , ์ด๊ฒ์ ๋๋ฅด๋ฉด Post๋ฅผ ํ๋ค.
์ฐ์ ์ด๋ฆ๋ถํฐ ์ถ๊ฐ
extension Notification.Name {
static let changeLabel = Notification.Name("changeLabel")
}
๊ทธ๋ฆฌ๊ณ ,
ViewController 3๊ฐ๊ฐ ์๊ณ
๊ฐ ViewDidLoad์ addObserverํด์ค๋ค.
/////////////////VC1
// ViewDidLoad
NotificationCenter.default.addObserver(self, selector: #selector(change1), name: .changeLabel, object: nil)
// change1 ํจ์ ๋ด์ฉ
self.label1.text = "Change Label1!!!"
/////////////////VC2
// ViewDidLoad
NotificationCenter.default.addObserver(self, selector: #selector(change2), name: .changeLabel, object: nil)
// change2 ํจ์ ๋ด์ฉ
self.label2.text = "Change Label2!!!"
/////////////////VC3
// ViewDidLoad
NotificationCenter.default.addObserver(self, selector: #selector(change3), name: .changeLabel, object: nil)
// change3 ํจ์ ๋ด์ฉ
self.label3.text = "Change Label3!!!"
๋ง์ง๋ง์ผ๋ก Bnt ๋ฒํผ ๋ฉ์๋ ์ ์
NotificationCenter.default.post(name: .changeLabel, object: nil)
๊ฒฐ๊ณผ
๊ทธ๋ผ gif๋ ํ ์ค ๋ชจ๋ฅด๋ (๋ฐฉ๊ธ ๋ฐฐ์. ๋จ์ถ์ด ์งฑ์งฑ)
์ Gif์ ๋์จ๊ฒ์ฒ๋ผ, ์ง์ VC2๋ฟ๋ง ์๋๋ผ ํ์ฌ ์คํ์ ์๋ VC1๊น์ง ๋ชจ๋ ์๋ํ๋ค.
์ต์ ๋ฒ ์ ๊ฑฐ
๋ค๋ฅธ ์๋ฏธ๋ก ์ฌ๊ธฐ์ ์ ์๊ฐํด๋ด์ผํ๋๊ฒ, observer๊ฐ ๊ณ์ ์ด์์๋ค๋ ๊ฒ์ด๋ค.
๊ทธ๋ ๋ด ์ ๊ฑฐ๋ ๋ฐ๋ก ํด์ค์ผํ๋ค๋๊ฒ์ด๋ค. ๋ถํ์ํ๋ฐ ๊ณ์ ๋จ์์์ด์ ์ข์๊ฒ์ 1๋ ์์ผ๋๊น!
์ ๊ฑฐ๋ ๊ฐ๋จ.
NotificationCenter.default.removeObserver(self, name: .changeLabel, object: nil)
์ถ๊ฐ : Postํ ๋ ๊ฐ๋ ์ ๋ฌ
Post๋ฉ์๋ ํ๋ผ๋ฏธํฐ์ object
๋ ์์๋ค. ์์์ nil
์ ๋ฃ์์ง๋ง, ์ด ๋ถ๋ถ์ ํตํด ๊ฐ์ ๋ณด๋ผ์ ์๋ค.
๊ธฐ์กด selector์ ๋ค์ด๊ฐ๋ ํจ์๋ฅผ ๋ณ๊ฒฝํด์ฃผ์(VC2๋ VC3๋ ๋ณ๊ฒฝ!)
// ๊ธฐ์กด
@objc func change1(_ notification: Notification) {
self.label1.text = "Change Label1!!!"
}
// ๋ณ๊ฒฝ
@objc func change1(_ notification: Notification) {
let getValue = notification.object as! String
self.label1.text = "Change \(getValue)"
}
์ฌ๊ธฐ์ String์ผ๋ก๋ง ๋ณด๋ผ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๊ฐ์ ๋ค์ด ์บ์คํ ! (as!)
btn์ Post๋ ์ด๋ ๊ฒ ๋ณ๊ฒฝ
ํ์
์ด Notification
์ธ ํ๋ผ๋ฏธํฐ notification
์ object
๊ฐ Post์ ์๋ object
๋ค.
// ๊ธฐ์กด
@IBAction func doPost(_ sender: UIButton) {
NotificationCenter.default.post(name: .changeLabel, object: nil)
}
// ๋ณ๊ฒฝ
@IBAction func doPost(_ sender: UIButton) {
NotificationCenter.default.post(name: .changeLabel, object: "Object")
}
๊ฒฐ๊ณผ
PS. ๋ ์ ์ ํ ์์๋ฅผ ์์ ๋ค๋ฉด ๋๊ธ ๋ถํ ๋๋ฆฝ๋๋ค!! ๊ฐ์ด ๊ณต๋ถํด์!