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

2024-02-02

我知道一般来说,发布者比闭包更强大,但是我想询问并讨论一个具体的例子:

func getNotificationSettingsPublisher() -> AnyPublisher<UNNotificationSettings, Never> {
   let notificationSettingsFuture = Future<UNNotificationSettings, Never> { (promise) in
      UNUserNotificationCenter.current().getNotificationSettings { (settings) in
         promise(.success(settings))
      }
   }
   return notificationSettingsFuture.eraseToAnyPublisher()
}

我认为这是未来发布者的一个有效示例,可以在这里使用它而不是使用完成处理程序。让我们用它做点什么:

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

因此,一旦我收到一个值,我就会取消订阅。 (我想我可以在完成水槽的关闭时做同样的事情)。

这样做的正确方法是什么?因为如果我使用闭包,那么它会被调用与调用函数一样多的次数,而如果它只被调用一次,那么我不需要取消任何东西。

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

最后但并非最不重要的一点是,调用完成后,我还需要取消订阅吗?我至少需要更新可取消并将其设置为零,对吧?我假设将订阅存储在一个集合中是为了长时间运行的订阅,但是单值订阅呢?

Thanks


而不是使用.sink运算符,您可以使用Sink直接订户。这样您就不会收到AnyCancellable你需要保存的。当发布者完成订阅时,Combine 会清理所有内容。

func test() {
    getNotificationSettingsPublisher()
        .subscribe(Subscribers.Sink(
            receiveCompletion: { _ in },
            receiveValue: ({
                print("value: \($0)")
            })
        ))
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swift 合并发布者与完成处理程序以及何时取消 的相关文章

随机推荐