- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经看到如何从一些 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/
我有以下代码: [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayerWillEnt
我从mockito开始,想知道如何假装添加观察者。我想编写一个测试来确保观察者计数在函数调用后增加。 示例测试代码: MyClassUnderTest instance = new MyClassUn
在我的应用程序(游戏)中,当按下中心/主页或锁定按钮时,我试图使用 NSNotificationCenter 暂停和恢复游戏。这是我正在使用的代码: [[NSNotificationCenter de
我尝试使用 NotificationCenter.addObserver(...) 打开本地通知时启用进入特定 View 的功能 我的代码是 override func viewDidLoad() {
在 XCode 5.1(和 CorePlot 1.4)之前,有两个对象可以正常接收 NSNotifications。但是,对于 XCode 5.1.1 (Coreplot 1.5),我发现如果 add
我目前正在为大学开发一款小游戏。我有一个扩展 Observable 并实现接口(interface)的模型。 由于接口(interface)的原因,我每次都必须为我添加的每个观察者重写 addObse
我有多种操作(派生自 NSOperation)通过 Internet 进行异步查询。按照惯例,我通过观察它们的 isFinished 属性来确定它们何时完成。 当一个特定类型的操作完成时,我想使用第一
我正在尝试获取 AVPlayer timedMetadata,但永远不会调用观察者 self.metaItem!.addObserver(self, forKeyPath: "metaData", o
我需要使用 NSNotificationCenter 在新数据来自 WCSession 时更新我,以便我可以填写我的 tableview。 我在列出的每个函数上都设置了断点,但出于某种原因,它直接转到
根据我的理解,addObserver 方法的 object 参数是您要从中接收通知的对象。大多数时候,我将其视为 nil(我假设这是因为所有对象都需要指定类型的通知)。在我的特殊情况下,我在屏幕顶部和
大家好多年阅读 StackOverflow,现在我决定加入。我正在努力解决这个问题: 我有一个“Depot”实体,它有两个对多关系“Persons”和“Trucks”。我想观察在给定“Depot”对象
每当我的 UILabel 中的文本发生更改时,我都会尝试获取通知,以便我可以调整它的大小以适应新文本。这是我的代码: public class MessageContainer : UILabel {
我看过NSNotification addObserver/removeObserver 放在viewDidLoad/viewDidUnload , viewDidAppear/viewDidDisa
所以我有一个像public class Main Implements Observer{}这样声明的函数,里面有主函数public static void main(String[] args) {
我正在尝试创建让我的 View 在键盘打开后移动。但我遇到了一个非常意想不到的问题。 这是我的代码: override func viewDidLoad() { super.viewDidLo
我正在尝试从位置管理器对象向我的 viewController 发出通知。它不起作用 - addObserver 方法中的选择器未被调用。 位置管理器 Object.m 文件(具有标准分派(dispa
有没有办法获取在 NSManagedObject 上使用 addObserver:forKeyPath:options:context: 和选项 NSKeyValueChangeInsertion 添
如何在 SwiftUI 中添加 NotificationCenter.default.addObserve? 当我尝试添加观察者时出现以下错误 Argument of '#selector' refe
我已经看到如何从一些 NotificationCenter 代码使用 Publisher 过渡到 Combine,但还没有看到如何为类似的东西做到这一点: NotificationCe
我习惯于在初始化方法中加入“[NSNotificationCenter defaultCenter] addObserver”。而且我已经看到很多其他人放在 viewDidLoad 中。是否有任何说明
我是一名优秀的程序员,十分优秀!