- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
是否有处理 AnyCancellable
数组的好方法?删除存储的 AnyCancellable
什么时候完成/取消?
说我有这个
import Combine
import Foundation
class Foo {
private var cancellables = [AnyCancellable]()
func startSomeTask() -> Future<Void, Never> {
Future<Void, Never> { promise in
DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(2)) {
promise(.success(()))
}
}
}
func taskCaller() {
startSomeTask()
.sink { print("Do your stuff") }
.store(in: &cancellables)
}
}
taskCaller
被称为
AnyCancellable
创建并存储在数组中。
var taskCancellable: AnyCancellable?
taskCancellable = startSomeTask().sink { print("Do your stuff") }
class Bar {
private var task1: AnyCancellable?
private var task2: AnyCancellable?
private var task3: AnyCancellable?
private var task4: AnyCancellable?
private var task5: AnyCancellable?
private var task6: AnyCancellable?
}
最佳答案
我在开发一个应用程序时问自己同样的问题,该应用程序会生成大量最终存储在同一数组中的可取消项。对于长期存在的应用程序,数组大小可能会变得很大。
即使内存占用很小,那些仍然是对象,它们消耗堆,这会导致堆碎片及时。
我找到的解决方案是在发布者完成后删除可取消的:
func consumePublisher() {
var cancellable: AnyCancellable!
cancellable = makePublisher()
.sink(receiveCompletion: { [weak self] _ in self?.cancellables.remove(cancellable) },
receiveValue: { doSomeWork() })
cancellable.store(in: &cancellables)
}
确实,代码不是那么漂亮,但至少没有内存浪费:)
func cleanupCompletion<T>(_ cancellable: AnyCancellable) -> (Subscribers.Completion<T>) -> Void {
return { [weak self] _ in self?.cancellables.remove(cancellable) }
}
func consumePublisher() {
var cancellable: AnyCancellable!
cancellable = makePublisher()
.sink(receiveCompletion: cleanupCompletion(cancellable),
receiveValue: { doSomeWork() })
cancellable.store(in: &cancellables)
}
或者,如果您需要支持以完成工作:
func cleanupCompletion<T>(_ cancellable: AnyCancellable) -> (Subscribers.Completion<T>) -> Void {
return { [weak self] _ in self?.cancellables.remove(cancellable) }
}
func cleanupCompletion<T>(_ cancellable: AnyCancellable, completionWorker: @escaping (Subscribers.Completion<T>) -> Void) -> (Subscribers.Completion<T>) -> Void {
return { [weak self] in
self?.cancellables.remove(cancellable)
completionWorker($0)
}
}
func consumePublisher() {
var cancellable: AnyCancellable!
cancellable = makePublisher()
.sink(receiveCompletion: cleanupCompletion(cancellable) { doCompletionWork() },
receiveValue: { doSomeWork() })
cancellable.store(in: &cancellables)
}
关于swift - 发布者完成后从 AnyCancellable 数组中删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60685810/
我在玩 Combine,我意识到不是在 AnyCancellable 上调用 .cancel(),而是让 AnyCancellable 成为 Optional 并将其设置为 nil 也会停止值流。 将
是否有处理 AnyCancellable 数组的好方法?删除存储的 AnyCancellable什么时候完成/取消? 说我有这个 import Combine import Foundation cl
我有一个URLSession.shared.dataTaskPublisher,我将其存储在AnyCancellable -s中。当我收到一个值并完成后,我希望将此AnyCancellable从集合中
除非明确取消,否则我希望所有发布商都执行。我不介意 AnyCancellable 超出范围,但是根据文档,它会在 deinit 上自动调用 cancel,这是不希望的。 我曾尝试使用可取消包,但 An
假设您正在使用内置 .store(in:) AnyCancellable 上的方法,如下所示: private var subscriptions = Set() let newPhotos = ph
我以这种方式定义了带有一次性 Set 的 ViewModel class ViewModel { private var disposables = Set() func sync() {
我目前有一个类型为 AnyPublisher 的发布者我正在尝试附加订阅者并捕获结果 AnyCancelable 。 Xcode 的自动完成功能表明我应该能够执行此操作,但是当实际输入代码时,我遇到编
如果我已将可取消集存储到 ViewController 中: private var bag = Set() 其中包含多个订阅。 1 - 我应该在 deinit 中取消订阅吗?或者它会自动完成工作?
我正在使用 Swift Joint,但不明白两者之间的区别 func subscribe(_ subscriber: S) where S : Subscriber, Self.Failure ==
我是一名优秀的程序员,十分优秀!