Sobes.tech
Junior

Čo je centrum oznámení?

sobes.tech AI

Odpoveď od AI

Centrum oznámení, alebo NotificationCenter, je mechanizmus v Foundation, ktorý implementuje vzor "Pozorovateľ" (Observer). Umožňuje objektom široko rozširovať oznámenia ostatným objektom, ktoré sa na ne prihlásili.

Kľúčové komponenty:

  • Publisher (Vydavateľ): Objekt, ktorý zverejňuje oznámenie.
  • Observer (Pozorovateľ): Objekt, ktorý sa prihlási na oznámenie a naň reaguje.
  • Notification (Oznámenie): Objekt, ktorý predstavuje samotnú udalosť. Obsahuje názov oznámenia, odosielateľa a voliteľný slovník s používateľskými informáciami.

Výhody:

  • Slabé prepojenie medzi objektmi.
  • Vhodné na rozosielanie udalostí mnohým odberateľom.

Nevýhody:

  • Zložitosť pri ladení kvôli nepriamej interakcii.
  • Potenciálne problémy s riadením životného cyklu pozorovateľov, ak nie sú správne odstránení.

Príklad publikovania a prihlásenia:

import Foundation

// Názov oznámenia
extension Notification.Name {
    static let myCustomNotification = Notification.Name("myCustomNotification")
}

// Vydavateľ
class Publisher {
    func publishNotification() {
        let userInfo: [AnyHashable: Any] = ["data": "some important data"]
        NotificationCenter.default.post(name: .myCustomNotification, object: self, userInfo: userInfo)
        print("Oznámenie publikované")
    }
}

// Pozorovateľ
class Observer {
    init() {
        // Prihlásenie na oznámenie
        NotificationCenter.default.addObserver(self, selector: #selector(handleNotification(_:)), name: .myCustomNotification, object: nil)
    }

    // Metóda, ktorá sa volá pri prijatí oznámenia
    @objc func handleNotification(_ notification: Notification) {
        print("Oznámenie prijaté!")
        if let userInfo = notification.userInfo {
            print("Používateľské informácie: \(userInfo)")
        }
    }

    deinit {
        // Odhlásenie z oznámenia pri deinit
        NotificationCenter.default.removeObserver(self)
    }
}

// Použitie
let publisher = Publisher()
let observer = Observer()

publisher.publishNotification()