gpt4 book ai didi

Swift Combine发布者与完成处理程序以及何时取消

转载 作者:行者123 更新时间:2023-12-03 09:29:21 25 4
gpt4 key购买 nike

我知道一般而言,发布者比闭包更强大,但是我想提出并讨论一个具体示例:

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
}
}

因此,一旦我收到一个值,就取消订阅。 (我可以在接收器的完成关闭中做同样的事情)。

这样做的正确方法是什么?因为如果我使用闭包,那么它将被调用的次数与调用函数的次数相同,并且如果只调用一次,则无需取消任何操作。

您是否会说普通的完成处理程序可以被Combine代替,如果可以,您将如何处理接收一个值然后取消的情况?

最后但并非最不重要的一点是,称为完成,我还需要取消订阅吗?我至少需要更新可取消对象并将其设置为nil,对吗?我假设将订阅存储在一组中是针对长期运行的订阅,但是单值订阅又如何呢?

谢谢

最佳答案

除了使用.sink运算符,您还可以直接使用Sink订户。这样,您不会收到需要保存的AnyCancellable。发布者完成订阅后,Combine将清理所有内容。

func test() {
getNotificationSettingsPublisher()
.subscribe(Subscribers.Sink(
receiveCompletion: { _ in },
receiveValue: ({
print("value: \($0)")
})
))
}

关于Swift Combine发布者与完成处理程序以及何时取消,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62037727/

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