gpt4 book ai didi

swift - 合并:从带有选择器的通知中心 addObserver 到通知发布者

转载 作者:行者123 更新时间:2023-11-28 10:27:03 26 4
gpt4 key购买 nike

我已经看到如何从一些 NotificationCenter 代码使用 Publisher 过渡到 Combine,但还没有看到如何为类似的东西做到这一点:

        NotificationCenter.default.addObserver(
self,
selector: #selector(notCombine),
name: NSNotification.Name(rawValue: "notCombine"),
object: nil
)

我已经看到它可以作为 Publisher 使用,但是我没有选择器并且我不确定该怎么做:

        NotificationCenter.default.publisher(
for: Notification.Name(rawValue: "notCombine")
)

有人知道吗?谢谢!

最佳答案

您说“我没有选择器”是对的,因为那是正确的一半。您可以使用 Combine 从通知中心接收通知。

要点的另一半是,您可以将处理通知的逻辑推送到 Combine 管道中,这样正确的结果就可以在到达您时直接从管道末端弹出。

老式的方式

假设我有一个卡片 View ,当它通过发布通知被点击时会发出虚拟的尖叫声:

static let tapped = Notification.Name("tapped")
@objc func tapped() {
NotificationCenter.default.post(name: Self.tapped, object: self)
}

现在让我们假设,为了示例的目的,游戏在收到这些通知之一时感兴趣的是发布通知的卡片的 name 属性的字符串值。如果我们以老式方式执行此操作,那么获取该信息是一个两个阶段的过程。首先,我们必须注册才能接收通知:

NotificationCenter.default.addObserver(self, 
selector: #selector(cardTapped), name: Card.tapped, object: nil)

然后,当我们收到通知时,我们必须查看它的 object 是否真的是一个 Card,如果是,获取它的 name 属性并执行一些东西:

@objc func cardTapped(_ n:Notification) {
if let card = n.object as? Card {
let name = card.name
print(name) // or something
}
}

合并方式

现在让我们使用 Combine 框架做同样的事情。我们通过调用其 publisher 方法从通知中心获取发布者。但我们不止于此。如果 object 不是 Card,我们不想收到通知,因此我们使用 compactMap 运算符将其安全地转换为 Card(如果不是t a Card,管道就停止了,好像什么都没发生过一样)。我们只需要卡片的 name,所以我们使用 map 运算符来获取它。结果如下:

let cardTappedCardNamePublisher = 
NotificationCenter.default.publisher(for: Card.tapped)
.compactMap {$0.object as? Card}
.map {$0.name}

假设 cardTappedCardNamePublisher 是我们 View Controller 的一个实例属性。那么我们现在拥有的是一个实例属性,如果 Card 发布了 tapped 通知,它会发布一个字符串,否则什么都不做。

当我说逻辑被插入管道时,你明白我的意思了吗?

那么我们如何安排接收来自管道末端的内容呢?我们可以使用水槽:

let sink = self.cardTappedCardNamePublisher.sink {
print($0) // the string name of a card
}

如果您尝试一下,您会发现我们现在的情况是,每次用户点击卡片时,都会打印卡片的名称。这相当于我们之前使用选择器注册观察者方法的 Combine。

关于swift - 合并:从带有选择器的通知中心 addObserver 到通知发布者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58559908/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com