gpt4 book ai didi

swift - 奇怪的TableView和SearchBar

转载 作者:行者123 更新时间:2023-11-30 11:25:03 30 4
gpt4 key购买 nike

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

错误视频: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!)
}
}
}
}
}

TableView的代码:

     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。为了验证这一点,我将类似您的代码的内容放在 Playground 中并进行了测试:

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.)

这是 MKErrorLoadingThrottled。这个错误,根据Apple dev ,发生在

The data was not loaded because data throttling is in effect. This error can occur if an app makes frequent requests for data over a short period of time.

进一步根据Apple dev :

There are no request limits per app or developer ID, so well-written apps that operate correctly should experience no problems. However, throttling may occur in a poorly written app that creates extremely large numbers of requests.

所以最后,问题的解决方案可能是延迟搜索请求的开始,直到用户完成输入(您可以使用一个计时器,当用户在一段时间内没有按任何键盘键时触发) .)

PS:非常重要的是,请记住在开始新请求之前取消您之前的请求,否则您会遇到意想不到的行为

关于swift - 奇怪的TableView和SearchBar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50833507/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com