본문 바로가기
Xcode/Swift - PlayGround

PlayGround) Notification Center의 사용법

by 후르륵짭짭 2021. 9. 3.
728x90
반응형

 

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로 넣어주는 방법을 통해 좀더 쉽게 찾을 수 있고

역할에 대한 정의를 쉽게 알 수 있도록 했습니다.

728x90
반응형

댓글