Notification을 사용하는 것을 별로 안 좋아하지만,,,
회사일을 하면서 사용 하지 않고는 너무 어려운 구조 였기 때문에 결국 사용했습니다.
그러면서 Notification을 어떻게 사용하는지 공부를 했었는데, 간략하게 정리하고자 합니다.
A와 B 관계를 정의 할 때, 서로 의존성을 줄 수 없는 상황일 때,
관계를 만들어줘야하는 상황인데, 서로 너무 멀리 떨어져 있고, 붙여주기 위해서는 대대적인 코드 공사가 필요 할 것 같아서
이 Notification을 사용 했습니다.
https://www.youtube.com/watch?v=7mdHYSX7jbU
< 힘들 때 들으면 희망이 차오르는 노래입니다.>
** 사용 방법 **
class Receiver {
let notificationToken : NSObjectProtocol!
init(){
notificationToken = NotificationCenter.default.addObserver(forName: NSNotification.Name.init("Hello"), object: Sender.shared, queue: nil, using: { notification in
if Thread.isMainThread {
print("Main Thread")
} //NIl로 하면 Post에서 보낸 Thread와 동일한 쓰레드에서 작동한다.
let object = notification.object
let userinfo = notification.userInfo
print(object , userinfo)
if let sender = object as? Sender {
print(sender.name)
}
})
}
deinit {
print("Remove Class")
NotificationCenter.default.removeObserver(notificationToken)
}
}
class Sender {
static let shared = Sender()
var name = "Taesoo"
init(){
print("Create Sender")
}
func sendData(){
NotificationCenter.default.post(name: NSNotification.Name("Hello"), object: self, userInfo: ["Hello" : 1])
}
}
class Virus {
var name = "Virus"
init(){
print("Create Virus")
NotificationCenter.default.post(name: NSNotification.Name("Hello"), object: self, userInfo: ["World" : 2])
}
}
주의 깊게 볼 것만 적도록 하겠습니다.
- Notification 생성 -
NotificationCenter.default.addObserver(forName: NSNotification.Name.init(노티피케이션 이름),
object: 특정 객체에서만 쏜 것을 받을 겁니다.,
queue: 쓰레드를 설정 하겠습니다.,
using: { notification in 어떻게 사용 })
이렇게 되어 있습니다 .
forName = 이름을 설정해주는 겁니다.
이렇게 이름을 전역으로 사용해주면 더욱 편리하고 좋습니다.
object : 특정 객체에서 쏜 것만 받을 때 사용
class Sender {
static let shared = Sender()
var name = "Taesoo"
init(){
print("Create Sender")
}
func sendData(){
NotificationCenter.default.post(name: NSNotification.Name("Hello"), object: self, userInfo: ["Hello" : 1])
}
}
이렇게 Sender.shared() 를 해서 싱글톤 객체라고 했을 때,
Object에 Sender.shared를 넣어주면 Sender에서 보내준 것만 받을 수 있게 해줍니다.
꼭 싱글톤이 아니고 self로 하면 현제 객체에서 보낸 것만 받아서 사용하면 되는 것이죠.
그냥 주소값만 같으면 됩니다.
queue : 어떤 쓰레드에서 작동 시킬 것인가.
queue : OperationQueue.main
이렇게 넣어주면 Main Thread에서 작동하게 할 수 있습니다.
근데 nil로 해준다면 post에서 보낸 쓰레드와 동일한 쓰레드에서 작동하게 됩니다.
using : 어떻게 사용 할 것인가?
let object = notification.object // 보내진 객체
let userinfo = notification.userInfo // Dictionary
object 같은 경우는 notification에서 object로 객체를 보내주면 저기로 들어오게 됩니다.
그리고 사용할 때는 아래 처럼 TypeCasting을 해서 풀어서 사용해주면 됩니다.
if let sender = object as? Sender {
print(sender.name)
}
** 값 보내기 **
NotificationCenter.default.post(name: NSNotification.Name("Hello"), object: self, userInfo: ["Hello" : 1])
값을 보낼 때는 더욱 간단하게 할 수 있습니다.
위에 처럼 한줄로 끝낼 수 있습니다.
name : 해당 노티피케이션 이름을 찾아서 보내줄 겁니다.
object : 보내줄 객체
userInfo : Dictionary 타입으로 보내준다.
** 나의 사용 방법 **
Notification의 가장 큰 단점은 수신자의 위치와 송신자의 위치를 찾기 쉽지 않다는 단점이 있습니다.
그렇기 때문에 가능하면 사용하는 것을 자제 합니다.
벗트, 어쩔 수 없으면 사용해야합니다.
그래서 저는 Notification에서 중요한 것은 수진자라 생각 했기 때문에,
수신자 객체에 Extension으로 송신자가 하는 역할을 Static Func로 넣어주는 방법을 통해 좀더 쉽게 찾을 수 있고
역할에 대한 정의를 쉽게 알 수 있도록 했습니다.
'Xcode > Swift - PlayGround' 카테고리의 다른 글
PlayGround) URLSessionDownload를 이용해서 PDF 파일 다운로드 (0) | 2021.12.26 |
---|---|
PlayGround)Enum의 활용 (0) | 2021.09.22 |
PlayGround) RxMvvm에서 Input과 Output에서 의문점 (0) | 2021.09.03 |
(Swift) Closure - Capturing Value (0) | 2021.09.03 |
PlayGround) 런타임 프로토콜 AND 컴파일 프로토콜 (클로저 잠깐,,) (1) | 2021.04.25 |
댓글