Swift 结合发布者与完成处理程序以及何时取消
Swift Combine publishers vs completion handler and when to cancel
我知道通常发布者比闭包更强大,但是我想问和讨论一个具体的例子:
func getNotificationSettingsPublisher() -> AnyPublisher<UNNotificationSettings, Never> {
let notificationSettingsFuture = Future<UNNotificationSettings, Never> { (promise) in
UNUserNotificationCenter.current().getNotificationSettings { (settings) in
promise(.success(settings))
}
}
return notificationSettingsFuture.eraseToAnyPublisher()
}
我认为这是 Future 发布者的一个有效示例,可以在此处使用它而不是使用完成处理程序。让我们用它做点什么:
func test() {
getNotificationSettingsPublisher().sink { (notificationSettings) in
// Do something here
}
}
这有效,但它会告诉我接收器 (AnyCancellable
) 的结果未被使用。因此,每当我尝试获取一个值时,我都需要存储可取消项或分配它直到我获取一个值。
是否有类似 sinkOnce 或自动销毁可取消项的功能?有时我不需要任务来取消。但是我可以这样做:
func test() {
self.cancellable = getNotificationSettingsPublisher().sink { [weak self] (notificationSettings) in
self?.cancellable?.cancel()
self?.cancellable = nil
}
}
所以一旦我收到一个值,我就会取消订阅。 (我想我可以在 sink 的完成关闭中做同样的事情)。
正确的做法是什么?因为如果我用闭包,函数调用多少次它就会被调用多少次,如果只调用一次,那我什么都不用取消。
您认为正常的完成处理程序可以用 Combine 代替吗?如果可以,您将如何处理接收一个值然后取消?
最后但同样重要的是,调用完成,我还需要取消订阅吗?我至少需要更新 cancellable 并将其设置为 nil 对吧?我假设将订阅存储在一个集合中是为了长期 运行 订阅,但是单值订阅呢?
谢谢
您可以直接使用 Sink
订阅者,而不是使用 .sink
运算符。这样您就不会收到需要保存的 AnyCancellable
。当发布者完成订阅时,Combine 会清理所有内容。
func test() {
getNotificationSettingsPublisher()
.subscribe(Subscribers.Sink(
receiveCompletion: { _ in },
receiveValue: ({
print("value: \([=10=])")
})
))
}
我知道通常发布者比闭包更强大,但是我想问和讨论一个具体的例子:
func getNotificationSettingsPublisher() -> AnyPublisher<UNNotificationSettings, Never> {
let notificationSettingsFuture = Future<UNNotificationSettings, Never> { (promise) in
UNUserNotificationCenter.current().getNotificationSettings { (settings) in
promise(.success(settings))
}
}
return notificationSettingsFuture.eraseToAnyPublisher()
}
我认为这是 Future 发布者的一个有效示例,可以在此处使用它而不是使用完成处理程序。让我们用它做点什么:
func test() {
getNotificationSettingsPublisher().sink { (notificationSettings) in
// Do something here
}
}
这有效,但它会告诉我接收器 (AnyCancellable
) 的结果未被使用。因此,每当我尝试获取一个值时,我都需要存储可取消项或分配它直到我获取一个值。
是否有类似 sinkOnce 或自动销毁可取消项的功能?有时我不需要任务来取消。但是我可以这样做:
func test() {
self.cancellable = getNotificationSettingsPublisher().sink { [weak self] (notificationSettings) in
self?.cancellable?.cancel()
self?.cancellable = nil
}
}
所以一旦我收到一个值,我就会取消订阅。 (我想我可以在 sink 的完成关闭中做同样的事情)。
正确的做法是什么?因为如果我用闭包,函数调用多少次它就会被调用多少次,如果只调用一次,那我什么都不用取消。
您认为正常的完成处理程序可以用 Combine 代替吗?如果可以,您将如何处理接收一个值然后取消?
最后但同样重要的是,调用完成,我还需要取消订阅吗?我至少需要更新 cancellable 并将其设置为 nil 对吧?我假设将订阅存储在一个集合中是为了长期 运行 订阅,但是单值订阅呢?
谢谢
您可以直接使用 Sink
订阅者,而不是使用 .sink
运算符。这样您就不会收到需要保存的 AnyCancellable
。当发布者完成订阅时,Combine 会清理所有内容。
func test() {
getNotificationSettingsPublisher()
.subscribe(Subscribers.Sink(
receiveCompletion: { _ in },
receiveValue: ({
print("value: \([=10=])")
})
))
}