【发布时间】:2020-10-14 00:45:55
【问题描述】:
我正在关注这篇文章:https://www.peteralt.com/blog/mapkit-location-search-with-swiftui/
我已经设置了一个像这样的 LocationSearchService:
extension LocationSearchService: MKLocalSearchCompleterDelegate {
func completerDidUpdateResults(_ completer: MKLocalSearchCompleter) {
self.searchResults = completer.results
self.status = completer.results.isEmpty ? .noResults : .result
}
func completer(_ completer: MKLocalSearchCompleter, didFailWithError error: Error) {
self.status = .error(error.localizedDescription)
}
}
class LocationSearchService: NSObject, ObservableObject {
enum LocationStatus: Equatable {
case idle
case noResults
case isSearching
case error(String)
case result
}
@Published var queryFragment: String = ""
@Published private(set) var status: LocationStatus = .idle
@Published private(set) var searchResults: [MKLocalSearchCompletion] = []
private var queryCancellable: AnyCancellable?
private let searchCompleter: MKLocalSearchCompleter!
init(searchCompleter: MKLocalSearchCompleter = MKLocalSearchCompleter()) {
self.searchCompleter = searchCompleter
super.init()
self.searchCompleter.delegate = self
queryCancellable = $queryFragment
.receive(on: DispatchQueue.main)
.debounce(for: .milliseconds(250), scheduler: RunLoop.main, options: nil)
.sink(receiveValue: { fragment in
self.status = .isSearching
if !fragment.isEmpty {
self.searchCompleter.queryFragment = fragment
} else {
self.status = .idle
self.searchResults = []
}
})
}
}
不幸的是,我得到了这样的值,其中包含“搜索附近”。如何过滤掉这个?
【问题讨论】:
-
我能够在下面找到答案,但我使用的代码与您的非常相似。我注意到这里有内存泄漏。在 receiveValue 我相信它应该捕获
[weak self]然后self.应该替换为self?.