奇怪的表格视图和搜索栏



我的搜索栏和表格视图有一个非常奇怪的问题。 我有一个带有此搜索栏的MapView,您可以在搜索栏中搜索地点名称,并使用数据库过滤名称,如果该名称存在,它将添加到TableView中。 我可以毫无问题地搜索它,但我遇到了两个奇怪的问题。 如果我在 TableView 中得到 3-4 个值,如果我搜索第五个值,它将不会显示。 我遇到的第二个问题是,如果我获得相似的地名并且我单击两个中的一个,如果我尝试第二次研究它,表格视图将仅显示我之前单击的名称,如果我尝试第三次单击它并尝试研究它, 表视图不会显示它。 (当我单击TableView上的值时,它只是在地图上显示它。

错误视频:https://streamable.com/e72wn

法典:

extension LocationSearchTable : UISearchResultsUpdating {
func updateSearchResults(for searchController: UISearchController) {
//print("updateSearchResults")
// *When user open the Search Bar and he doesn't type text or the text is very short this code clean the TableView.*
let searchText = searchController.searchBar.text
if searchText == nil || searchText!.isEmpty {
seenNames.removeAll()
matchingItems.removeAll()
self.tableView.reloadData()
}
guard let mapView = mapView else { return }
let request = MKLocalSearchRequest()
request.naturalLanguageQuery = searchText
request.region = mapView.region
let search = MKLocalSearch(request: request)
search.start { response, _ in
guard let response = response else {
return
}
for (index , name) in response.mapItems.enumerated() {
let item = response.mapItems[index]
if(checkIfNameExistInDB(key: String(name.name!)) != nil && !seenNames.contains(name.name!)){
matchingItems.append(item)
seenNames.insert(name.name!)
self.tableView.reloadData()
}
else {
print(name.name!)
}
}
}
}
}

表视图代码:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell")!
let selectedItem = matchingItems[indexPath.row].placemark
cell.textLabel?.text = selectedItem.name
cell.imageView?.image = imageWithImage(image: UIImage(named: "search_1x")!, scaledToSize: CGSize(width: 20, height: 20))
cell.detailTextLabel?.text = parseAddress(selectedItem: selectedItem)
return cell
}

在带有名字的错误之后,搜索栏看起来像被阻止并且不搜索任何内容

您的第一个问题是由键入搜索词时生成的大量请求引起的,因为在键入或删除的每个字符上都会创建并启动新的 MKLocalSearch。 为了验证这一点,我将类似于您的代码的东西放在操场上并进行了测试:

import PlaygroundSupport
import UIKit
import MapKit
PlaygroundPage.current.needsIndefiniteExecution = true
var searches = [MKLocalSearch]()
for i in 1...100 {
let request = MKLocalSearchRequest()
request.naturalLanguageQuery = "Via roma n. (i), Roma"
let search = MKLocalSearch(request: request)
search.start { (response, error) in
guard error == nil else {
print("request (i) finished with error (error!.localizedDescription)")
return
}
guard let _ = response else {
print("request (i) finished with no response")
return
}
print("request (i) completed successfully!")
}
searches.append(search)
}

您将看到某些请求已完成而没有错误,对于某些请求,您将获得

The operation couldn’t be completed. (MKErrorDomain error 3.)

这是MKErrorLoadThrottled。根据Apple开发人员的说法,此错误发生在以下情况下

未加载数据,因为数据限制已生效。如果应用在短时间内频繁请求数据,则可能会发生此错误。

此外,根据苹果开发:

每个应用或开发者 ID 没有请求限制,因此编写良好且运行良好的应用应该不会遇到任何问题。但是,限制可能发生在编写不佳的应用中,该应用会创建大量请求。

因此,最后,问题的解决方案可能是延迟搜索请求的开始,直到用户完成键入(您可以使用在用户一段时间内未按任何键盘键时触发的计时器。

PS:很重要的就是记得取消你之前的请求,然后再开始一个新的请求,否则你会得到意想不到的行为

最新更新