具有@Published的SwiftUI和Combine Observable对象不断发布

时间:2019-12-06 22:50:51

标签: swiftui combine

我对搜索栏有这样的视图模型,它对键入到bar中的术语进行了搜索。然后,它发出请求并分配给结果。

class SearchViewModel<T>: ObservableObject {

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

    private var disposables = Set<AnyCancellable>()

    init() {
        $searchTerm
            .debounce(for: .seconds(1), scheduler: DispatchQueue.global())
            .flatMap { term in
                self.search(by: term)
            }
            .print("searching")
            .assign(to: \.results, on: self)
            .store(in: &disposables)
    }

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

View正在基于$ viewModel.results检查结果是否以全屏模式显示结果视图。

但是,尽管搜索通常被隐藏(如果用户未点击按钮),但此发布者流中经常会出现一些意外事件

2019-12-06 23:45:09.810053+0100 CRM[1589:440623] [SwiftUI] Publishing changes from background threads is not allowed; make sure to publish values from the main thread (via operators like receive(on:)) on model updates.
Dim drag (19.666656494140625, -1.6666717529296875)
searching: receive subscription: (FlatMap)
searching: request unlimited
Dim drag (42.33332824707031, -7.6666717529296875)
End dim drag: (56.33332824707031, -13.333328247070312)
searching: receive subscription: (FlatMap)
searching: request unlimited
searching: receive subscription: (FlatMap)
searching: request unlimited
searching: receive subscription: (FlatMap)
searching: request unlimited
Search button tapped!
searching: receive value: ([])
searching: receive value: ([])
searching: receive value: ([])
searching: receive value: ([])

这很奇怪,因为仅应在键入该字段的输入(项)上触发此操作。

我认为这里有问题。

更新!

重要的是,此多个搜索流日志将显示在控制台中,如果使用条形按钮将其显示在“汉堡”菜单中,则只有一个刷新。显示视图(或更确切地说,使用偏移量移动视图会导致@Published var term获得新输入有点奇怪,而且我看到我的List内容也在刷新。

1 个答案:

答案 0 :(得分:0)

使用它并不是一个明显的测试环境,但是在下面的帮助下,我使用过滤器进行了重构

.debounce(for: .seconds(1), scheduler: DispatchQueue.global())
.filter { !$0.isEmpty }

无论如何在这种情况下避免重新搜索相同的术语也是有用的。