SwiftUI和ObservableObject ViewModels导致内存泄漏,任何示例我应如何在ObservableObject中使用Combine

时间:2020-05-20 11:08:22

标签: memory-leaks swiftui combine observableobject

我有一个示例ViewModel,在Instruments中可以看到的是,类似的ViewModel正在泄漏内存

class SearchViewModel<T>: ObservableObject {

    @Published var searchTerm : String = ""
    @Published var results: [T] = []

    private var disposables = Set<AnyCancellable>()

    init() {

        _searchTerm.projectedValue
        //$searchTerm
            .debounce(for: .milliseconds(350), scheduler: DispatchQueue.global())
            .flatMap { [weak self] term -> AnyPublisher<[T], Never> in

                 self?.search(by: term) ?? Empty().eraseToAnyPublisher()
            }
            .print("searching")
            .receive(on: DispatchQueue.main)
            .assignNotRetain(to: \.results, on: self)
            //.assign(to: \.results, on: self)
            .store(in: &disposables)

    }

    open func search(by term: String) -> AnyPublisher<[T], Never> {
        fatalError()
    }
}

我在flatMap中添加了[weak self],并将.assign(to)更改为自定义.assignNotRetain(to),后者将接收器与[weak self]一起使用,它的泄漏较少(有deinit调用),但有更多的init调用然后取消通话!这导致一次性用品:设置为未取消分配/取消的预订

这只是示例视图模型的类似方法,即调用serivce,然后通过接收器观察输出,进行分配和更新@Published碰巧会泄漏内存,而一次性物品通常不会被释放,所以我应该在View onDisappear中手动取消AnyCancellable吗?

0 个答案:

没有答案