iyOmSd/Title: Swift

[Swift] Notification Center, Notification Queue

냄수 2020. 11. 20. 23:00
반응형

Notification Center의 post는

동기적으로 동작하죠

post a

post b

를 했다면

a의 옵저버함수가 끝날때까지

b를 실행하지 않아요

 

옵저버함수가 실행이 오래걸린다면

마냥 기다릴순 없으니..!

비동기적인 API가 있는데요

 

바로바로

Notification Queue!!

가 있는데

한번 사용해보려구요 ㅎㅎ

 

Notification Center의 버퍼다!

 

다른건 아니고

NotificationCenter에 들어오는 post를 관리해주는거라고생각해요

이벤트 등록을 할때

Notification Center를 이용해서 옵저버를 등록하거든요 ㅎㅎ

 

기본적인 사용법은

let center = NotificationCenter.default
let queue = NotificationQueue.default

center.addObserver(self, selector: #selector(self.bObserver), name: .b, object: nil)
queue.enqueue(Notification(name: .a), postingStyle: .now)

이벤트 발생post는 

queue.enqueue를 이용하고

 

이벤트 등록은

center.addObserver를 이용해요

 

notification 파라미터엔 post할 notification을 넣어주고

 

postingStyle이라는게 있어요

 

하나씩 비교해볼까요?

 

now

합체이후? 즉시 post한다

Notification Center같이 동기동작(지금당장 실행해!)

 

asap

현재 notification이 끝나거나 타이머가 끝난뒤 post한다

코드가 끝난뒤 마지막에 실행해라!

whenIdle

유휴상태일때 즉, 아무동작없이 쉬고있을때 post한다

아무것도 없으면 실행해라!

 

무슨소린가...

가볍게 테스트를 해봤어요

    extension Notification.Name {
        static let a = Notification.Name("a")
        static let b = Notification.Name("b")
    }
    
    func test() {
        let center = NotificationCenter.default
        let queue = NotificationQueue.default
        
        center.addObserver(self, selector: #selector(self.aObserver), name: .a, object: nil)
        center.addObserver(self, selector: #selector(self.bObserver), name: .b, object: nil)
        
        print("post a")
        queue.enqueue(Notification(name: .a), postingStyle: .asap)
        print("post b")
        queue.enqueue(Notification(name: .b), postingStyle: .asap)
        print("finish")
    }
    
    @objc
    func aObserver() {
        print("A pig...")
        (0...10).forEach { _ in print("🐷") }
        print("A end")
    }
    
    @objc
    func bObserver() {
        print("B dog...")
        (0...10).forEach { _ in print("🐶") }
        print("B end")
    }

 

a - asap

b - asap

해당하는 notification이 다 호출된뒤에

옵저버에 등록한 함수가 실행되네요

 

 

a - now

b - asap

a가 다 실행된 이후에

코드들이 실행되고

마지막에 옵저버에 등록한 b함수가 실행되네요

 

a - whenIdle

b - asap

코드실행이 다 되고

마지막에 b옵저버가 실행되고

아예끝나고 아무것도 없으니 a옵저버가 실행되네요

 

차이가 느껴지시나요 ㅎㅎ..

우선순위가

now > asap > whenIdle

인거 같구요

아무튼!

Notification Queue를 사용할땐 now를 쓰면 Center쓰는것과 같으니 주의할것..!

 

 

 

반응형