[Swift] Swift์ ์ฐ์ฒด๊ตญ, NotificationCenter
NotificationCenter
์ต์ ๋ฒ ํจํด? ๋ฐํ-๊ตฌ๋ ํจํด?
์ด์ ํฌ์คํธ์์ ์ต์ ๋ฒ ํจํด๊ณผ ํ์ญํจํด์ผ๋ก ๋ถ๋ฆฌ๋ ๋ฐํ-๊ตฌ๋ ํจํด์ ์ ๋ฆฌํ ์ ์ด ์์์ต๋๋ค. ๋ ํจํด์ ๋ํ ์ดํด๊ฐ ์์ผ๋ฉด ํจ์ฌ ๋ ์ฌ๋ฏธ์์ผ๋ ๋ ํฌ์คํธ๋ฅผ ๋จผ์ ์ฐธ๊ณ ํด์ฃผ์ธ์! [์ต์ ๋ฒํจํด][ํ์ญํจํด] ์ค์ํํธ์ NotificationCenter๋ ๋ฐํ-๊ตฌ๋ ํจํด๊ณผ ์ ์ฌํ๊ฒ ๋์ํฉ๋๋ค. ๋ฐํ-๊ตฌ๋ ํจํด์์ ์ด๋ฒคํธ ๋ธ๋ก์ปค์ ํด๋นํ๋ ์ค๊ฐ์์ ์ญํ ์ NotificationCenter ๊ฐ์ฒด๊ฐ ํ๊ฒ๋์ฃ . NotificationCenter๋ผ๋ ์ด๋ฆ์ฒ๋ผ ์์ ์๊ฒ ๋ฑ๋ก๋ ์น๊ตฌ๋ค์๊ฒ ์๋ฆผ์ ๋ณด๋ด์ฃผ๋ ๊ฐ์ฒด๊ฐ NotificationCenter์ ๋๋ค!
์ฉ์ด ์ ๋ฆฌ
๋จผ์ NotificationCenter์์ ์ฌ์ฉํ๋ ์ฉ์ด๋ถํฐ ์ ๋ฆฌํ๊ฒ ์ต๋๋ค.
NotificationCenter
์์ ์ค๋ช ํ ๊ฒ์ฒ๋ผ, NotificationCenter๋ ๊ฐ์ฒด๋ก๋ถํฐ ์ด๋ค ์ด๋ฒคํธ๋ฅผ ๋ฐ์ ์์ ์๊ฒ ๋ฑ๋ก๋ ๊ฐ์ฒด๋ค์๊ฒ ์๋ฆผ์ ๋ณด๋ด์ฃผ๋ ๊ฐ์ฒด์ ๋๋ค. NotificationCenter๋ ์ฑ๊ธํค์ผ๋ก ๊ตฌ์ฑ๋์ด ์์ด ์ฌ์ฉ์๊ฐ ์ธ์คํด์ค๋ฅผ ๋ง๋ค์ง ์๊ณ NotificationCenter๋ฅผ ๋ถ๋ฅผ ์ ์์ต๋๋ค. ๋์์ ์ฑ๊ธํค์ด๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ๋ ๋ฌธ์ ์ ๋ ์๋๋ฐ์, A์ B๋ผ๋ ๊ฐ์ฒด๊ฐ ์์ ๋, ์ด๋ค ์ด๋ฒคํธ๋ฅผ A๋ง ๋ฐ๊ฒ ํ๊ณ ์ถ์ด๋ A์ B๋ NotificationCenter์ ์ฑ๊ธํค ์ธ์คํด์ค๋ฅผ ๊ณต์ ํ๊ธฐ ๋๋ฌธ์ ๋ ๊ฐ์ฒด๊ฐ ๋ชจ๋ ์๋ฆผ์ ๋ฐ๊ฒ ๋ฉ๋๋ค. ๋ฌผ๋ก ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ ๋ฐฉ๋ฒ๋ ์์ต๋๋ค! ์๋์์ ๋ ์์ธํ ์ค๋ช ํด๋ณผ๊ฒ์~!
Observer
์ต์ ๋ฒ ํจํด์ Observer๋ผ๋ ์ฉ์ด๋ฅผ ๊ธฐ์ตํ์๋์? NotificationCenter์ Observer๋ NotificationCenter์ ์์ ์ ์ ๋ณด๋ฅผ ๋ฑ๋กํ์ฌ ์๋ฆผ์ ๋ฐ๊ณ ์ ํ๋ ๊ฐ์ฒด๋ฅผ ์๋ฏธํฉ๋๋ค. ๋ชจ๋ ๊ฐ์ฒด๋ Observer๊ฐ ๋ ์๋ ์๊ณ , ์ด๋ฒคํธ๋ฅผ ๋ณด๋ด๋ ๊ฐ์ฒด๊ฐ ๋ ์๋ ์์ต๋๋ค.
Post
Post๋ ๊ฐ์ฒด๊ฐ NotificationCenter๋ก ์ด๋ฒคํธ๋ฅผ ๋ณด๋ด๋ ํ์๋ฅผ ์๋ฏธํฉ๋๋ค. ๋ฐํ-๊ตฌ๋ ํจํด์์ ๋ฐํ์ ํด๋น๋๋ค๊ณ ์๊ฐํ๋ฉด ๋๊ฒ ์ฃ ?
Notification
Notification์ ์ด๋ฒคํธ๋ฅผ ๋ฐํํ๋ ๊ฐ์ฒด๊ฐ NotificationCenter์ ๋ณด๋ด๋ ์ด๋ฒคํธ๋ฅผ ์๋ฏธํฉ๋๋ค.
NotificationName
์์์ NotificationCenter๋ ์ฑ๊ธํค์ด๋ผ๊ณ ํ์์ฃ ? ๊ทธ๋ผ ์ด๋ฒคํธ๋ฅผ ์ฌ๋ฌ ๊ฐ ๋ง๋ค๊ณ ์ถ์ ๋๋ ์ด๋ป๊ฒ ํ ๊น์? ์๋ฅผ ๋ค์ด, ์์์ ๋ฐ๊พธ๋ ์๋ฆผ, ์ ๋๊ป๋ฅผ ๋ฐ๊พธ๋ ์๋ฆผ์ ๋ณด๋ด๊ณ ์ ํ๋ค๋ฉด, ์ฑ๊ธํค์ธ NotificaionCenter๋ ์์ ์๊ฒ ๋ณด๋ด์ง๋ ์ด๋ฒคํธ๊ฐ ์ด๋ค ์ด๋ฒคํธ์ธ์ง ์๊ณ ์์ด์ผ ํฉ๋๋ค. ๊ทธ๋์ ์ด๋ฒคํธ๋ฅผ ๋ณด๋ด๋ ๊ฐ์ฒด๋ NotificationName์ด๋ผ๋ ์๋ณ์๋ฅผ NotificationCenter์ ์๋ ค์ฃผ์ด์ ์ด๋ฅผ ๊ตฌ๋ถํ ์ ์๊ฒ ํฉ๋๋ค.
์ฌ์ฉํด๋ณด๊ธฐ
๊ทธ๋ผ ์ด์ ๊ฐ๋จํ ์์ ๋ฅผ ํตํด์ ์ฃผ์ํ ๊ธฐ๋ฅ๋ค์ ์ฌ์ฉํด๋ณด๊ฒ ์ต๋๋ค!
import Foundation
class Chatter {
let name: String
let isMaster: Bool
init(name: String, isMaster: Bool) {
self.name = name
self.isMaster = isMaster
}
func join(to room: GroupChatRoom) {
}
func send(message: String, to room: GroupChatRoom) {
}
func sendToMaster(message: String, to room: GroupChatRoom) {
}
}
class GroupChatRoom {
let name: String
init(name: String) {
self.name = name
}
func send(message: String, senderName: String) {
}
func sendToMaster(message: String, senderName: String) {
}
}
๋จผ์ ์์ฃผ ๊ธฐ๋ณธ์ ์ธ ๊ตฌํ์ ํด๋์์ต๋๋ค. ๊ทธ๋ฃน์ฑํ ๋ฐฉ์ ํํํ๋ GroupChatRoom์ ์ฌ์ฉ์๋ค์ด ๋ณด๋ด๋ ๋ฉ์์ง๋ฅผ ์ด ๋ฐฉ์ ๊ฐ์ ๋ ๋ชจ๋ ์ฌ์ฉ์๋ค์๊ฒ ์ ๋ฌํ๋ ์ญํ ์ ํฉ๋๋ค. ๊ฐ ์ฌ์ฉ์๋ค์ ์ด๋ฆ๊ณผ, ๋ฐฉ์ฅ์ธ์ง ์ฌ๋ถ์ ๋ํ ์ ๋ณด๋ง ๊ฐ์ง๊ณ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ํน์ ํ ๊ทธ๋ฃน์ฑํ ๋ฐฉ์ ๊ฐ์ ํ๊ฑฐ๋, ํด๋น ๋ฐฉ์ ๋ฉ์์ง๋ฅผ ๋ณด๋ผ ์๋ ์์ต๋๋ค. ์ด ์์ ์์์ ๋ชฉํ๋ ์ฌ์ฉ์๋ค์ด ๋ณด๋ด๋ ๋ฉ์์ง๋ฅผ GroupChatRoom์ ํตํด ์ฑํ ๋ฐฉ์ ๊ฐ์ ๋ ๋ค๋ฅธ ์ฌ์ฉ์๋ค์๊ฒ ๋ฟ๋ ค์ฃผ๋ ๊ฒ์ ๋๋ค.
์ ๊ฐ ์ํ๋ ์๋๋ฆฌ์ค๋ ์ด๋ ์ต๋๋ค:
- ๊ทธ๋ฃน ์ฑํ ๋ฐฉ์ ๊ฐ์ ํ๋ฉด ์๋์ผ๋ก Observer๊ฐ ๋๋ค.
- ์ฌ์ฉ์๋ค์ "SendMessage"๋ผ๋ NotificationName์ผ๋ก ์์ ์ด ๋ณด๋ด๊ณ ์ ํ๋ ๋ฉ์์ง๋ฅผ ์ด๋ฒคํธ๋ก ๋ฐํํ ์ ์๋ค.
- ์ฌ์ฉ์๋ค์ "SendMessage"์ ๋ํ ์๋ฆผ์ ๋ฐ์ผ๋ฉด ์์ ์ ์ด๋ฆ๊ณผ ๋ฐ์ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ๋ค.
- ์ฌ์ฉ์๋ค์ "SendMessageToMaster"๋ผ๋ NotificationName์ผ๋ก ๋ฐฉ์ฅ์๊ฒ๋ง ๋ฉ์์ง๋ฅผ ๋ณด๋ด๋ ์ด๋ฒคํธ๋ฅผ ๋ฐํํ ์ ์๋ค.
- ๋ฉ์์ง๋ค์ ํ ์ฑํ ๋ฐฉ ๋ด์์๋ง ์ ํจํ๊ณ ๋ค๋ฅธ ์ฑํ ๋ฐฉ์๋ ์ ์ก๋์ง ์๋๋ค.
๊ทธ๋ผ ์ ์๋๋ฆฌ์ค๋ฅผ ๊ทธ๋๋ก ๊ตฌํํด๋ณด๋๋ก ํฉ๋๋ค!
1. ๊ทธ๋ฃน์ฑํ ๋ฐฉ์ ๊ฐ์ ํ๋ฉด ์๋์ผ๋ก Observer๊ฐ ๋๋ค.
์ฌ์ฉ์๋ค์ด ๊ฐ์ ์ ํ ๋, ์ต์ ๋ฒ๋ก ๋ฑ๋ก์ ํด์ฃผ๋ฉด ๋๋๋ฐ์, NotificationCenter์์๋ addObserver ๋ฉ์๋๋ฅผ ์ ๊ณตํฉ๋๋ค.
func addObserver(
_ observer: Any,
selector aSelector: Selector,
name aName: NSNotification.Name?,
object anObject: Any?
)
์ด๋ ๊ฒ addObserver์ ๋ค ๊ฐ์ง ํ๋ผ๋ฏธํฐ๊ฐ ์์ต๋๋ค. ๊ฐ ํ๋ผ๋ฏธํฐ๋ ๊ณต์๋ฌธ์์ ๋์์๋ ๋๋ก ์ ๋ฆฌํด๋ณด๊ฒ ์ต๋๋ค!
observer
์ต์ ๋ฒ๋ก ๋ฑ๋กํ ๊ฐ์ฒด๋ฅผ ๋ฃ์ด์ค๋๋ค. ์ฐ๋ฆฌ์ ์์์์๋ ์ฑํ ๋ฐฉ์ ์ฐธ์ฌํ๋ ๊ฐ ์ฐธ์ฌ์๋ค์ ์ธ์คํด์ค๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ๋๊ฒ ๋ค์.
aSelector
aSelector๋ ์ต์ ๋ฒ๊ฐ Notification์ ๋ฐ์์ ๋ ์ํํ ์์ ์ด ๋ฌด์์ธ์ง ํ์ํฉ๋๋ค. Object-C ํจ์๋ฅผ ์ ์ํ๊ณ ํจ์์ ์ด๋ฆ์ selector๋ก ์์ฑํด์ค ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๋ฉ์์ง๋ฅผ ๋ฐ์์ ๋ ์ด๋ฆ๊ณผ ๋ฐ์ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅ๊ธฐ๋ก ํ์ผ๋ ์ด์ ๋ํ ๋ก์ง์ ๊ตฌํํ ํจ์๋ฅผ ์ถ๊ฐํด์ฃผ๋ฉด ๋๊ฒ ์ฃ ?
aName
name์ ์ ๋ฌ๋ฐ์ Notification์ ์ด๋ฆ์ ์ ์ต๋๋ค. ์ด ์ต์ ๋ฒ๋ค์ด ์ด๋ค ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ง ์ฌ๊ธฐ์ ๊ฒฐ์ ํ ์ ์์ต๋๋ค. ๋ง์ฝ nil์ ๊ฐ์ผ๋ก ๋ฃ์ผ๋ฉด NotificationName์ ๊ณ ๋ คํ์ง ์๊ณ ๋ชจ๋ Notification์ ๋ฐ๊ฒ ๋ฉ๋๋ค. ์ฐ๋ฆฌ๊ฐ ๋ณด๋ผ ์ด๋ฒคํธ๋ ๋ ์ข ๋ฅ์์ฃ ? SendMessage, SendMessageToMaster๋ฅผ ์ด๊ณณ์ ๋ฑ๋กํด๋ณด๋ฉด ์ด๋จ๊น์?
anObject
์ด ํ๋ผ๋ฏธํฐ๋ฅผ ํตํด์ Notification์ ๋ณด๋ด๋ ๊ฐ์ฒด๋ฅผ ํน์ ํ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ์ ์์์์๋ ์ฌ๋ฌ ์ฑํ ๋ฐฉ๋ผ๋ฆฌ๋ ๋ฉ์์ง๋ฅผ ๊ณต์ ํ๋ฉด ์ ๋๊ธฐ ๋๋ฌธ์ ์์ ์ด ์ํ ์ฑํ ๋ฐฉ์์ ์ค๋ ๋ฉ์์ง๋ง ๋ฐ๋๋ก ํด์ผ๊ฒ ๋ค์.
๊ทธ๋ผ ๊ตฌํํด๋ณผ๊น์?
func join(to room: GroupChatRoom) {
NotificationCenter.default.addObserver(
self,
selector: #selector(didReceiveMessage(_:)),
name: Notification.Name("SendMessage"),
object: room
)
if self.isMaster {
NotificationCenter.default.addObserver(
self,
selector: #selector(didReceiveMessageToMaster(_:)),
name: Notification.Name("SendMessageToMaster"),
object: room
)
}
}
Chatter ํด๋์ค์ join ๋ฉ์๋๋ฅผ ์์ ๊ฐ์ด ๊ตฌํํ์์ต๋๋ค. ๊ฐ ์ฌ์ฉ์๋ค์ join ๋ฉ์๋๋ฅผ ํธ์ถํด์ ์์ ์ด ๊ฐ์ ํ ์ฑํ ๋ฐฉ ๊ฐ์ฒด๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค. ๊ฐ์ ๋๋ ์๊ฐ์ ๊ฐ์ ํ ์ฑํ ๋ฐฉ์ ๋ํ Observer๋ก ์ฌ์ฉ์๋ค์ ๋ฑ๋กํด์ผ ํ๋๋ฐ์, ์ด๋ฅผ ์ํด์ addObserver ๋ฉ์๋๋ฅผ ํธ์ถํ๊ณ ์ธ์๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ค์ ํ์ต๋๋ค.
- observer: self - ์ฑํ ๋ฐฉ์ ๊ฐ์ ํ ์ฌ์ฉ์ ์๊ธฐ ์์ ์ NotificationCenter์ ๋ฑ๋กํฉ๋๋ค.
- selector: #selector(didReceiveMessage) - ์ด๋ฒคํธ์ ๋ํ ์๋ฆผ์ ๋ฐ์์ ๋ ์คํํ ๋ฉ์๋๋ฅผ ์ง์ ํฉ๋๋ค. ์ฌ๊ธฐ์๋ didReceiveMessage๋ก ์ง์ ํ์ต๋๋ค. ์ด์ ๊ฐ์ ํด๋์ค ๋ด๋ถ์ ํด๋น ํจ์๋ฅผ ๊ตฌํํด์ฃผ์ด์ผ ํฉ๋๋ค.
- name: Notification.Name("SendMessage"): Notification์ ์ด๋ฆ์ SendMessage๋ก ํ๊ธฐ๋ก ํ์์ฃ ? ๊ทธ๋๋ก ์ค์ ํ์ต๋๋ค.
- object: room - ์ฑํ ๋ฐฉ์ ๊ฐ์ ๋ ์ฌ์ฉ์๋ค ์ฌ๋ฌ ์ฑํ ๋ฐฉ ์ค์์ ์์ ์ด ๊ฐ์ ํ ์ฑํ ๋ฐฉ์์ ์ค๋ ๋ฉ์์ง๋ง ๋ฐ์์ผ ํฉ๋๋ค. ๊ทธ๋์ ๋ฐ์ ์ ๊ฐ์ฒด๋ฅผ ๊ฐ์ ํ ์ฑํ ๋ฐฉ์ผ๋ก ์ง์ ํ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์์ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ๋ง์ฝ ์ฌ์ฉ์๊ฐ ๋ฐฉ์ฅ์ผ ๊ฒฝ์ฐ์๋ ๋ฐฉ์ฅ์๊ฒ ๋ณด๋ด๋ ๋ฉ์์ง์ ๋ํ Observer๋ฅผ ์ถ๊ฐ์ ์ผ๋ก ๋ฑ๋กํ๊ฒ ํ์ต๋๋ค. selector์ ๋ฃ์ด์ฃผ์๋ ๋ฉ์๋๋ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํํ ์ ์์ต๋๋ค.
@objc func didReceiveMessage(_ notification: Notification) {
print("receive")
}
@objc func didReceiveMessageToMaster(_ notification: Notification) {
print("receive from member to master")
}
์ง๊ธ์ ์ผ๋จ ์ด๋ ๊ฒ ๋จ์ํ๊ฒ ๊ตฌํํด๋๊ฒ ์ต๋๋ค. NotificationCenter์ ์ง์ ํ๋ ๋ฉ์๋๋ ํญ์ ์ ์ด๋ ํ ๊ฐ์ ํ๋ผ๋ฏธํฐ๋ฅผ ๊ฐ์ง๋๋ค. Notification์ผ๋ก ์ ๋ฌ๋๋ ๋ฉ์์ง๋ฅผ ๋ํ๋ด๋ ๊ฐ์ฒด์ ๋๋ค.
2. ์ฌ์ฉ์๋ค์ "SendMessage"๋ผ๋ NotificationName์ผ๋ก ์์ ์ด ๋ณด๋ด๊ณ ์ ํ๋ ๋ฉ์์ง๋ฅผ ์ด๋ฒคํธ๋ก ๋ฐํํ ์ ์๋ค.
์ด์ ๋ฉ์์ง๋ฅผ ์ด๋ฒคํธ๋ก ๋ฐํํด๋ณด๊ฒ ์ต๋๋ค. ์๊น ๋ง๋ค์๋ Chatter ๊ฐ์ฒด์ GroupChatRoom ๊ฐ์ฒด์ send ๋ฉ์๋๋ฅผ ๊ตฌํํ๋ฉด ๋๊ฒ ์ฃ ?
func send(message: String, to room: GroupChatRoom) {
room.send(message: message, senderName: self.name)
}
func sendToMaster(message: String, to room: GroupChatRoom) {
room.sendToMaster(message: message, senderName: self.name)
}
Chatter์ ์๋ ๋ฉ์๋๋ ๋จ์ํ๊ฒ ์์ ์ ์ด๋ฆ์ ํฌํจํด์ GroupChatRoom์ ์ ๋ฌํด์ฃผ๋ฉด ๋ฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๋ ๊ฒ ํธ์ถ๋๋ GroupChatRoom ๊ฐ์ฒด์ send ๋ฉ์๋๋ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํํด๋ด ์๋ค.
func send(message: String, senderName: String) {
NotificationCenter.default.post(
name: Notification.Name("SendMessage"),
object: self,
userInfo: ["message":message, "room":self.name, "senderName":senderName]
)
}
func sendToMaster(message: String, senderName: String) {
NotificationCenter.default.post(
name: Notification.Name("SendMessageToMaster"),
object: self,
userInfo: ["message":message, "room":self.name, "senderName":senderName]
)
}
GroupChatRoom์ ์์ ์ด ์ง์ ๋ฉ์์ง๋ฅผ ์ ๋ฌํ์ง ์๊ณ , NotificationCenter๋ก ์์ ์ ๋ฐ์ ์๋ก ํ์ฌ ์ด๋ฒคํธ๋ฅผ ๋ณด๋ ๋๋ค. ์ด๋ฅผ ์ํด์ NotificationCenter์ post ๋ฉ์๋๋ฅผ ์ฌ์ฉํฉ๋๋ค.
func post(
name aName: NSNotification.Name,
object anObject: Any?,
userInfo aUserInfo: [AnyHashable : Any]? = nil
)
post ๋ฉ์๋์ ์ ์๋ ์์ ๊ฐ์ต๋๋ค. ์์์ ์ ์ํ๋ addObserver ๋ฉ์๋์ ๋์๋๋ ํ๋ผ๋ฏธํฐ๊ฐ ๋ณด์ด์ฃ ?
name ํ๋ผ๋ฏธํฐ์๋ ๋ณด๋ด๊ณ ์ ํ๋ Notification์ ์ด๋ฆ์ ์ ์ด์ค๋๋ค. object์๋ ์ด Notification์ ๋ณด๋ด๋ ๋ฐ์ ์ ๊ฐ์ฒด๋ฅผ ๋ด๊ณ , userInfo์๋ ์ถ๊ฐ์ ์ธ ๋ฐ์ดํฐ๋ค์ ๋ด์ ๋ณด๋ ๋๋ค.
๐ก object ํ๋ผ๋ฏธํฐ์๋ ๋ฐ์ดํฐ๋ฅผ ๋ด๋ ๊ฒ ์๋๋๋ค! object์ ๋ค์ด๊ฐ๋ ๊ฐ์ฒด์ ์ ๋ณด๋ก addObserver๋ฅผ ์ฌ์ฉํ์ ๋ ์ ์ํ ๋ฐ์ ์๋ฅผ ์๋ณํ๊ธฐ ๋๋ฌธ์ object์๋ ๋ฐ์ ์ ๊ฐ์ฒด๋ฅผ ๋ด๊ณ ํจ๊ป ์ ๋ฌํ๊ณ ์ ํ๋ ๋ฐ์ดํฐ๋ค์ userInfo์ ๋ด๋ ๊ฒ์ด ์์น์ ๋๋ค.
userInfo์ ๋ด์ ๋ฐ์ดํฐ๋ ๋์ ๋๋ฆฌ๋ก ๊ตฌ์ฑํฉ๋๋ค. ์ฐ๋ฆฌ์ ์์ ์์๋ ๋ฐ์ ์ ์ ๋ณด์ ๊ทธ๋ฃน์ฑํ ๋ฐฉ ๊ฐ์ฒด๋ฅผ ๋ด๊ณ , ๋ฉ์์ง, ๋ฉ์์ง๋ฅผ ๋ณด๋ด๋ ์ฌ๋์ ์ด๋ฆ, ์ฑํ ๋ฐฉ์ ์ด๋ฆ์ ๋ด์์ Notification์ ๋ณด๋ ๋๋ค.
3. ์ฌ์ฉ์๋ค์ "SendMessage"์ ๋ํ ์๋ฆผ์ ๋ฐ์ผ๋ฉด ์์ ์ ์ด๋ฆ๊ณผ ๋ฐ์ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ๋ค.
์๊น ์ ์ ๋ฏธ๋ฃจ์ด๋์๋ Chatter ๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ๊ตฌํํ ์ฐจ๋ก์ ๋๋ค. ์ด๋ฒคํธ๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ๋ฐ์ผ๋ฉด addObserver ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ selector ์ธ์์ ์ถ๊ฐํด์ฃผ์๋ ๋ฉ์๋๊ฐ ์คํ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ธ์๋ก Notification ๊ฐ์ฒด๊ฐ ์ ๋ฌ๋์ฃ . Notification ๊ฐ์ฒด ์์๋ Notification์ ๋ณด๋ผ ๋ ๋ด์๋ ์ ๋ณด๊ฐ ํฌํจ๋ฉ๋๋ค. ์ฐ๋ฆฌ๋ Notification์ ๋ณด๋ผ ๋, userInfo์ ์ ๋ณด๋ค์ ๋ด์๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ์ฌ์ฉํ๋๋ก ๋ฉ์๋๋ฅผ ๊ตฌ์ฑํด์ฃผ๊ฒ ์ต๋๋ค,
@objc func didReceiveMessage(_ notification: Notification) {
guard let roomName = notification.userInfo?["room"] as? String,
let message = notification.userInfo?["message"] as? String,
let sender = notification.userInfo?["senderName"] as? String else { return }
print("\(roomName)-\(sender)๋ก๋ถํฐ์ ๋ฉ์์ง: \(message) | \(self.name) ์์ ์๋ฃ")
}
@objc func didReceiveMessageToMaster(_ notification: Notification) {
guard let roomName = notification.userInfo?["room"] as? String,
let message = notification.userInfo?["message"] as? String,
let sender = notification.userInfo?["senderName"] as? String else { return }
print("\(roomName)-\(sender)๋ก๋ถํฐ์ ๋น๋ฐ๋ฉ์์ง: \(message) | \(self.name) ์์ ์๋ฃ")
}
๋ฉ์๋๊ฐ ํธ์ถ๋๋ฉด ์ ๋ฌ๋ Notification ๊ฐ์ฒด์์ userInfo๋ฅผ ์ฐพ์ต๋๋ค. ์ฌ๊ธฐ์๋ ๋์ ๋๋ฆฌ๋ก ์ ๋ฌํ ๋ฐ์ดํฐ๊ฐ ๋ด๊ฒจ ์๊ฒ ์ฃ ? ๊ทธ๋์ Notification์ ๋ณด๋ผ ๋ ์ฌ์ฉํ๋ ํค ๊ฐ๋ค์ ๊ทธ๋๋ ์ฌ์ฉํด์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ ์ถ๋ ฅํฉ๋๋ค. String์ผ๋ก ๋ค์ด ์บ์คํ ์ ์๋ํ๋ ๋ถ๋ถ์ด ์๋๋ฐ์, ์ด์ ๋ post ๋ฉ์๋์ ์ํ์ ๋ค์ ๋ณด๋ฉด ์ ์ ์์ต๋๋ค.
userInfo aUserInfo: [AnyHashable : Any]? = nil)
userInfo๋ ๋์ ๋๋ฆฌ์ ๊ฐ์ผ๋ก Anyํ์ ์ ๊ฐ์ง๋๋ค. ํ์ ์ด ํน์ ๋์ง ์์๊ธฐ ๋๋ฌธ์ Notification์ ๋ฐ์ ๋ฉ์๋๋ ์ ๋ฌ๋ ๋ฐ์ดํฐ์ ํ์ ์ ์ ์๊ฐ ์์ผ๋ ์ํ๋ ํ์ ์ผ๋ก ์บ์คํ ์ ํด์ฃผ์ด์ผ ํฉ๋๋ค.
์ฌ๊ธฐ๊น์ง ํ๋ค๋ฉด ์ผ๋จ ์์ฑ์ ๋๋ค! ํ๋ฒ ์คํํด๋ณผ๊น์?
let park = Chatter(name: "๋ฐ์ค์ฌ", isMaster: true)
let han = Chatter(name: "ํํธ์ด", isMaster: false)
let ahn = Chatter(name: "์์คํธ", isMaster: false)
let dpRoom = GroupChatRoom(name: "DP")
park.join(to: dpRoom)
han.join(to: dpRoom)
ahn.join(to: dpRoom)
park.send(message: "์ผ", to: dpRoom)
han.sendToMaster(message: "๋ฐ์ค์ฌ๋?", to: dpRoom)
// DP-๋ฐ์ค์ฌ๋ก๋ถํฐ์ ๋ฉ์์ง: ์ผ | ๋ฐ์ค์ฌ ์์ ์๋ฃ
// DP-๋ฐ์ค์ฌ๋ก๋ถํฐ์ ๋ฉ์์ง: ์ผ | ํํธ์ด ์์ ์๋ฃ
// DP-๋ฐ์ค์ฌ๋ก๋ถํฐ์ ๋ฉ์์ง: ์ผ | ์์คํธ ์์ ์๋ฃ
// DP-ํํธ์ด๋ก๋ถํฐ์ ๋น๋ฐ๋ฉ์์ง: ๋ฐ์ค์ฌ๋? | ๋ฐ์ค์ฌ ์์ ์๋ฃ
์ ๋์ํ๋ค์!
๊ทธ๋ผ ๋ช ๊ฐ์ง ์์ธ์ํฉ๋ ํ ์คํธํด๋ณด๊ฒ ์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ ํ๋ ์๋๋ฆฌ์ค์์ ์์ ์ด ๊ฐ์ ๊ทธ๋ฃน์ฑํ ๋ฐฉ์์ ์ ๋ฌ๋๋ ๋ฉ์์ง๋ง ๋ฐ๋๋ค๋ ์กฐ๊ฑด์ด ์์๋๋ฐ์, ๊ทธ๋ฃน์ฑํ ๋ฐฉ์ ํ๋ ๋ ๋ง๋ค์ด์ ํ ์คํธํด๋ณด๊ฒ ์ต๋๋ค.
let park = Chatter(name: "๋ฐ์ค์ฌ", isMaster: true)
let han = Chatter(name: "ํํธ์ด", isMaster: false)
let ahn = Chatter(name: "์์คํธ", isMaster: false)
let dpRoom = GroupChatRoom(name: "DP")
park.join(to: dpRoom)
han.join(to: dpRoom)
ahn.join(to: dpRoom)
let dpRoomWithoutPark = GroupChatRoom(name: "๊ฐ๋ถ์๋ DP ๋ฐฉ")
han.join(to: dpRoomWithoutPark)
ahn.join(to: dpRoomWithoutPark)
park.send(message: "์ผ", to: dpRoom)
han.sendToMaster(message: "๋ฐ์ค์ฌ๋?", to: dpRoom)
ahn.send(message: "ํํธ์ด ์๋ฑ๋?", to: dpRoomWithoutPark)
han.send(message: "์คํธ์ผ~~~", to: dpRoomWithoutPark)
han.sendToMaster(message: "๋ฐ๋ฒ๊ตฌ ์ค์ฌ๋ ๊ฐ์ด ์ง๊ณ ๋ฐ์์๋ค~~~!!!!", to: dpRoomWithoutPark)
๊ฐ๋ถ ์๋ ์ฑํ ๋ฐฉ ํ๋๋ฅผ ๋ง๋ค๊ณ , ๋ฉ์์ง๊ฐ ์ ๋์ฐฉํ๋์ง, ๊ทธ๋ฆฌ๊ณ ๋ฐฉ์ฅ์ด ์์ ๋ ๋ฉ์์ง๊ฐ ๋๊ตฌ์๊ฒ ์ ๋ฌ๋๋์ง ํ์ธํด๋ณด๊ฒ ์ต๋๋ค.
// DP-๋ฐ์ค์ฌ๋ก๋ถํฐ์ ๋ฉ์์ง: ์ผ | ๋ฐ์ค์ฌ ์์ ์๋ฃ
// DP-๋ฐ์ค์ฌ๋ก๋ถํฐ์ ๋ฉ์์ง: ์ผ | ํํธ์ด ์์ ์๋ฃ
// DP-๋ฐ์ค์ฌ๋ก๋ถํฐ์ ๋ฉ์์ง: ์ผ | ์์คํธ ์์ ์๋ฃ
// DP-ํํธ์ด๋ก๋ถํฐ์ ๋น๋ฐ๋ฉ์์ง: ๋ฐ์ค์ฌ๋? | ๋ฐ์ค์ฌ ์์ ์๋ฃ
// ๊ฐ๋ถ์๋ DP ๋ฐฉ-์์คํธ๋ก๋ถํฐ์ ๋ฉ์์ง: ํํธ์ด ์๋ฑ๋? | ํํธ์ด ์์ ์๋ฃ
// ๊ฐ๋ถ์๋ DP ๋ฐฉ-์์คํธ๋ก๋ถํฐ์ ๋ฉ์์ง: ํํธ์ด ์๋ฑ๋? | ์์คํธ ์์ ์๋ฃ
// ๊ฐ๋ถ์๋ DP ๋ฐฉ-ํํธ์ด๋ก๋ถํฐ์ ๋ฉ์์ง: ์คํธ์ผ~~~ | ํํธ์ด ์์ ์๋ฃ
// ๊ฐ๋ถ์๋ DP ๋ฐฉ-ํํธ์ด๋ก๋ถํฐ์ ๋ฉ์์ง: ์คํธ์ผ~~~ | ์์คํธ ์์ ์๋ฃ
์ํ๋ ์๋๋ฆฌ์ค๋๋ก ์ ๋์ํ๋ค์~! ์ด๋ ๊ฒ NotificationCenter๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ์ฒด ๊ฐ์ ํต์ ์ ๋ ์ฝ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค! ๋ฐํ-๊ตฌ๋ ํจํด์ ์ฅ์ ์ฒ๋ผ, ์ฑํ ๋ฐฉ์ ๋๊ฐ ์์ ์๊ฒ ๊ฐ์ ๋์ด์๋์ง ์ ๋ณด๋ฅผ ์ ์ฅํ ํ์๊ฐ ์๊ณ , ๋ฉค๋ฒ๋ค๋ ์ด๋ค ๋ฉค๋ฒ๋ค์ด ์๋์ง ๋ชปํ๋ ์ํฉ์์๋ ๋ฉ์์ง๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ์ ๋ฌํ ์ ์์ต๋๋ค. ์์คํ ๋ด๋ถ์ ์ผ๋ก ๋์ํ๋ค ๋ณด๋ ๋๋ฒ๊น ์ด ์ด๋ ต๋ค๋ ๋จ์ ์ด ์์ง๋ง ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์๋ ๊ธฐ์ ์ธ ๊ฒ ๊ฐ๋ค์.
๊ธด ๊ธ ์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค~! ์๋ชป๋ ๋ด์ฉ์ด ์๋ค๋ฉด ์๋ ค์ฃผ์ธ์!
์์ ์ฝ๋ ์ ์ฒด
'๐ ์์ด-์ค-์์ค > ๐ค ์ค์ํํธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift] GCD(Grand Central Dispatch) - Dispatch Queue (2) | 2021.10.25 |
---|---|
[Swift] ์ค์ํํธ์ ๊ณ ์ฐจํจ์๋ค(High Order Functions) (0) | 2021.10.10 |
[Swift] Struct vs. Class (2), Struct์์ ์ฐธ์กฐ ํ์ , Class ์์ ๊ฐ ํ์ ๋ณ์๊ฐ ์์ ๋ (0) | 2021.08.26 |
[Swift] Struct vs. Class (1), ์ธ์ ๋ญ ์จ์ผํ ๊น? (0) | 2021.08.25 |
[Swift] FileManager๋ก ํ์ผ ์ฝ๊ณ ์ฐ๊ธฐ (0) | 2021.08.22 |
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote