我对搜索栏有这样的视图模型,它对键入到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内容也在刷新。
答案 0 :(得分:0)
使用它并不是一个明显的测试环境,但是在下面的帮助下,我使用过滤器进行了重构
.debounce(for: .seconds(1), scheduler: DispatchQueue.global())
.filter { !$0.isEmpty }
无论如何在这种情况下避免重新搜索相同的术语也是有用的。