2

複数のリスナー/サブスクライバーに送信したいオブジェクトがあるため、Combine を調べていたところ、 と という 2 つの異なる種類のパブリッシャーが表示されNotificationCenter.PublisherましPassThroughSubjectた。なぜ誰かがNotificationCenter.Publisheroverを使うのか混乱していPassThroughSubjectます。

以下のコードを思いつき、両方の方法を示しました。要約する:

  • NotificationCenter.PublisherNotification.Name静的プロパティが必要です
  • 本当にタイプセーフではありませんか(同じNotification.Name/ 異なるパブリッシャーに対して異なる種類のオブジェクトを投稿できるためNotification.Name
  • NotificationCenter.default新しい値の投稿は、 (パブリッシャー自体ではなく)上で行う必要があります。
  • mapクロージャで使用される型への明示的なダウンキャスト

誰かがNotificationCenter.Publisheroverを使用するのはどのようなシナリオPassThroughSubjectですか?

import UIKit
import Combine

let passThroughSubjectPublisher = PassthroughSubject<String, Never>()
let notificationCenterPublisher = NotificationCenter.default.publisher(for: .name).map { $0.object as! String }

extension Notification.Name {
    static let name = Notification.Name(rawValue: "someName")
}


class PassThroughSubjectPublisherSubscriber {
    init() {
        passThroughSubjectPublisher.sink { (_) in
            // Process
        }
    }
}

class NotificationCenterPublisherSubscriber {
    init() {
        notificationCenterPublisher.sink { (_) in
            // Process
        }
    }
}

class PassThroughSubjectPublisherSinker {
    init() {
        passThroughSubjectPublisher.send("Henlo!")
    }
}

class NotificationCenterPublisherSinker {
    init() {
        NotificationCenter.default.post(name: .name, object: "Henlo!")
    }
}
4

2 に答える 2