在Combine的实验中,我看到了保留订阅服务器的AnyCancellable.store(in:)
方法。我一直在想这个设置:
class Controller
{
static var cancellables = Set<AnyCancellable>()
}
let label = UILabel(frame: .zero)
如果与保留Subscriber
相比有优势的话:
Controller.$value
.assign(to: UILabel.text, on: label)
.store(in: &cancellables)
超过这个:
let subscriber = Controller.$value
.assign(to: UILabel.text, on: label)
Controller.cancellables.insert(subscriber)
或者主要是风格。两者似乎都在测试中起作用。
如果知道只需要一个对AnyCancellable
的引用,则可以存储对该引用的直接引用并避免Set<AnyCancellable>
除此之外,除了风格上的区别之外,没有什么区别。我更喜欢store(in:)
,以避免使用局部变量来保持可读性。(当然,可以将管道的返回值封装在Controller.cancellables.insert
中,但这完全是丑陋的IMO。(
我仍然建议使用store(in:)
方法,这样,如果您最终需要保留更多AnyCancellable
引用,就不需要更改实现。