๐ŸŽ iOS & Swift

Notification, ์ฝ”๋“œ๋ฅผ ๊ฐœ์„ ํ•ด๋ณด์ž

taeeekki 2022. 8. 21. 02:57

๋“ค์–ด๊ฐ€๋ฉฐ

Notification์€ ๊ฐ’, ๋ฐ์ดํ„ฐ ์ „๋‹ฌํ•  ๋•Œ ์ •๋ง ์œ ์šฉํ•œ ๋…€์„์ด๋‹ค. ์–ด๋–ป๊ฒŒ ๋ณด๋ฉด ์‚ฌ์šฉ ๋ฐฉ๋ฒ•๋„ ๋˜๊ฒŒ ๋‹จ์ˆœํ•œ๋ฐ ์จ์•ผ ํ•  ์ฝ”๋“œ๊ฐ€ ๊ณณ๊ณณ์— ํผ์ ธ์žˆ๊ณ , ๋งŽ์ด ์“ฐ๋‹ค๋ณด๋ฉด ๊ด€๋ฆฌ๊ฐ€ ์–ด๋ ค์›Œ์ง„๋‹ค. ์ ์ ˆํ•  ๋•Œ ์“ฐ๋ฉด ์ฐธ ์ข‹์€ ์นœ๊ตฌ... (ํŠนํžˆ ๊ณ„์ธต์ด ๋ณต์žกํ•  ๋•Œ ์“ฐ๋ฉด ๊ฟ€์ด๋‹ค ๐Ÿฏ) ์˜ค๋Š˜ ๊ทธ๋ž˜์„œ ๋‹จ์ˆœํ•˜๊ฒŒ ์žฅ์  ์„ค๋ช…ํ•˜๋ ค๊ณ  ๊ธ€์„ ์“ฐ๊ฒŒ ๋œ ๊ฒƒ์€ ์•„๋‹ˆ๊ณ , ๋ถˆํŽธํ–ˆ๋˜ ์ ์„ ๊ฐœ์„ ํ•ด ๋ณธ ๊ฒƒ์„ ๊ธฐ๋กํ•˜๊ณ ์ž ํ•œ๋‹ค.

(์•„ ๊ทธ๋ฆฌ๊ณ  ๊ธ€ ์“ฐ๋‹ค ๋ณด๋ฉด ๋งํˆฌ๊ฐ€ ์ •๋ง ์˜ค๋ฝ๊ฐ€๋ฝ ํ•œ๋ฐ ์ดํ•ดํ•ด์ฃผ์‹œ๊ธธ ... ๊ธ€ ์ข€ ๋” ์จ๋ณด๊ณ  ํ•œ ๊ฐ€์ง€๋กœ ์ •์ฐฉํ•ด์•ผ๊ฒ ๋‹ค.)




๋ถˆํŽธํ–ˆ๋˜ ์ 

๋ถˆํŽธํ–ˆ๋˜ ์ ์€ Notification.Name ์•ˆ์— ๋“ค์–ด๊ฐ€๋Š” ๋ฌธ์ž์—ด์„ post ํ•˜๋Š” ์ชฝ๊ณผ addObserving ํ•˜๋Š” ์ชฝ์„ ์ •ํ™•ํžˆ ๋งž์ถฐ์ฃผ์–ด์•ผ ํ•œ๋‹ค๋Š” ์ ์ด๋‹ค. ํœด๋จผ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๊ณ , ์ฝ”๋“œ๊ฐ€ ๊ณณ๊ณณ์— ํผ์ ธ์žˆ์œผ๋ฉด ์ •๋ง ์ฐพ์•„๋ณด๊ธฐ ์–ด๋ ต๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ƒ๊ฐ๋ณด๋‹ค ์ฝ”๋“œ ๋ผ์ธ ์ˆ˜๊ฐ€ ์ข€ ๋งŽ์•„์ง€๊ณ , post ยท addObserver ยท removeObserver ยท ๊ทธ๋ฆฌ๊ณ  ์•ก์…˜์„ ์‹คํ–‰ํ•˜๋Š” ํ•จ์ˆ˜(๊ฐ’์„ ๋ฐ›์•„์„œ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Œ) ์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š” ํŒŒํŠธ๊ฐ€ ์ฐธ ๋งŽ๋‹ค.

์ฐธ ์ข‹์€๋ฐ ๊ท€์ฐฎ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ž˜์„œ ์ฒ˜์Œ์—๋Š” Property Wrapper๋กœ ์–ด์ฐŒ ํ•ด๋ณด๋ ค๋‹ค๊ฐ€ ๊ตณ์ด ๊ทธ๋ ‡๊ฒŒ๊นŒ์ง€ ๋ณต์žกํ•˜๊ฒŒ Wrapping์„ ์•ˆํ•ด๋„ ๋  ๊ฒƒ ๊ฐ™์•˜๋‹ค. ์ฐพ์•„๋ณด๋‹ˆ ๋‚˜๋ฆ„ ๋ผ์ธ ์ˆ˜๋ฅผ ์ค„์ด๋ฉด์„œ ํŽธ๋ฆฌํ•˜๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์•„์„œ ๊ธฐ๋กํ•˜๊ณ ์ž ํ•œ๋‹ค.



์˜ˆ์‹œ

๊ฐ„๋‹จํ•˜๊ฒŒ ์—ญ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ’์„ ์ „๋‹ฌํ•˜๋Š” ์˜ˆ์‹œ์ด๋‹ค.

Notification์„ ์ด์šฉํ•ด์„œ ์—ญ๋ฐฉํ–ฅ ๊ฐ’ ์ „๋‹ฌํ•˜๊ธฐ

์ฝ”๋“œ ๊ฐœ์„ 

extension Notification.Name {
    
    static let test = Notification.Name("test")
}

์ด๋ ‡๊ฒŒ Notification.Name์˜ Extension์œผ๋กœ Key๊ฐ’์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ฑด ๋งŽ์ด ์•Œ๊ณ  ์žˆ๋Š” ์‚ฌ์‹ค์ด๋‹ค. ๋ฆฌํ„ฐ๋Ÿดํ•œ ๊ฐ’์„ ๊ด€๋ฆฌํ•˜๊ธฐ๋Š” ์ข‹์ง€๋งŒ ์—ฌ์ „ํžˆ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š”์ฝ”๋“œ๊ฐ€ ๋งŽ๋‹ค. ๊ท€์ฐฎ๋‹ค..๐Ÿ˜‚

extension Notification.Name {
    
    func post(object: Any? = nil, userInfo: [AnyHashable : Any]? = nil) {
        print("โœˆ๏ธ ใ€ฐใ€ฐใ€ฐใ€ฐใ€ฐใ€ฐใ€ฐ post (์‹ ํ˜ธ ์ˆ์–ด์š”!!)")
        NotificationCenter.default.post(name: self, object: object, userInfo: userInfo)
    }

    @discardableResult
    func addObserver(object: Any? = nil, queue: OperationQueue? = nil, using: @escaping (Notification) -> Void) -> NSObjectProtocol {
        print("๐Ÿ‘€ ใ€ฐใ€ฐใ€ฐใ€ฐใ€ฐใ€ฐใ€ฐ addObserver (์˜ต์ €๋ฒ„ ๋“ฑ๋ก!!)")
        return NotificationCenter.default.addObserver(forName: self, object: object, queue: queue, using: using)
    }
    
    func removeObserver(observer: Any, object: Any? = nil) {
        print("โ›”๏ธ ใ€ฐใ€ฐใ€ฐใ€ฐใ€ฐใ€ฐใ€ฐ removeObserver (์˜ต์ €๋ฒ„ ๋“ฑ๋ก ํ•ด์ œ!!)")
        return NotificationCenter.default.removeObserver(observer, name: self, object: object)
    }
}

๊ทธ๋ž˜์„œ ์ด๋ ‡๊ฒŒ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค. ํ‚ค ๊ฐ’์— ๋”ฐ๋ผ์„œ Notification.Name ๊ฐ’์„ post, addObserver์— ๊ทธ๋Œ€๋กœ ์ด์šฉํ•˜์ž๋Š” ๊ฒƒ์ด๋‹ค.

1๏ธโƒฃ Post

// ์ „

NotificationCenter.default.post(
    name: Notification.Name("test"),
    object: nil,
    userInfo: ["message": messageTextField.text!]
)

// ํ›„

Notification.Name.test.post(object: nil, userInfo: ["message": messageTextField.text!])

๋‚˜๋Š” ํ›„์ž๊ฐ€ ๋” ๊น”๋”ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ ํŽธํ•˜๋‹ค๊ณ  ๋А๊ผˆ๋‹ค.


2๏ธโƒฃ addObserver

// ์ „

NotificationCenter.default.addObserver(
    self,
    selector: #selector(testObserver),
    name: Notification.Name("test"),
    object: nil
)

@objc func testObserver(_ notification: NSNotification) {
    if let message = notification.userInfo?["message"] as? String {
        self.overviewLabel.text = message
    }
}

// ํ›„

Notification.Name.test.addObserver { [weak self] noti in
    print("====================================")
    print("๐Ÿ“ฉ ใ€ฐใ€ฐใ€ฐใ€ฐใ€ฐใ€ฐใ€ฐ ๊ตฌ๋…(๋ฉ”์‹œ์ง€) ์•Œ๋ฆผ ์™”์–ด์š”์ž‰")
    print("====================================")
    
    guard let self = self else { return }
    self.overviewLabel.text = noti.userInfo?["message"] as? String
}

print๋ฌธ์„ ํฌํ•จํ•˜๊ณ  ๋ณด๋”๋ผ๋„ ํ›„์ž๊ฐ€ ํ›จ์”ฌ ๊ฐ„๋‹จํ•ด๋ณด์ธ๋‹ค. ํด๋กœ์ €๋ฅผ ํ†ตํ•ด ์ด์–ด์„œ ๋ฐ”๋กœ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค. ๊ฐœ์„ ์„ ํ•ด๋ณด๋ฉด์„œ ํŽธ๋ฆฌํ•จ์„ ๋А๊ผˆ๋‹ค. ๋ฌผ๋ก  ์ค‘์š”ํ•œ ๊ฑด ์ฝ”๋“œ๋ฅผ ์–ผ๋งˆ๋‚˜ ๊น”๋”ํ•˜๊ฒŒ ์“ฐ๋ƒ๋ณด๋‹ค ์ ์žฌ์ ์†Œ์— ์˜ฌ๋ฐ”๋ฅธ ์ฝ”๋“œ๋ฅผ ์“ธ ์ˆ˜ ์žˆ๋ƒ๊ฐ€ ์•„๋‹๊นŒ ์‹ถ๋‹ค.


ํ˜น์‹œ ์ž˜๋ชป๋œ ๋‚ด์šฉ์ด๋‚˜ ์ด์ƒํ•œ ์ ์ด ์žˆ๋‹ค๋ฉด ์–ธ์ œ๋“ ์ง€ ๋‹ต๊ธ€์„ ๋‹ฌ์•„์ฃผ์„ธ์š”!