gpt4 book ai didi

ios - Swift 远程搜索使 Tableview 崩溃

转载 作者:行者123 更新时间:2023-11-28 07:54:59 24 4
gpt4 key购买 nike

嘿,我有一个 tableview,上面有一个搜索栏。我请求一个带有搜索词的远程 rest-api。搜索栏功能看起来像这样(根据这篇文章:How to throttle search (based on typing speed) in iOS UISearchBar?)

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
NSObject.cancelPreviousPerformRequests(withTarget: self, selector: #selector(self.searchTeams), object: nil)
self.perform(#selector(self.searchTeams), with: nil, afterDelay: 0.3)
}

searchTeams-Func 看起来像这样,它调用带有完成处理程序的异步函数 loadingJSON:

loadingJSON("APIPATH", postString:"STRING") {
parseJSON in

if(String(describing: parseJSON) == "-1"){
print("No Internet")
} else {
if let teams = parseJSON["teams"] as? [[String: AnyObject]] {
self.teams.removeAll()

for team in teams {
//Parse data
}
self.tableView.reloadData()

}
}
}

这几乎是完美的。但有时应用程序会在以下行的 cellForRowAt-indexPath-Methode 中崩溃:

teamSearchResultsCell.TeamNameLable.text = self.teams[indexPath.row].teamName

indexPath.row = 0 但团队数组为空。所以我认为如果用户在函数清除数组但尚未重新加载 tableview 的那一刻点击单元格,就会发生这种情况。有解决这个问题的想法吗?

编辑:为感兴趣的人加载 JSON-func:

func loadingJSON(_ link:String, postString:String, completionHandler: @escaping (_ JSONObject: AnyObject) -> ()) {
if(Reachability.isConnectedToNetwork() == false){
completionHandler("-1" as AnyObject)
return
}

let request = NSMutableURLRequest(url: URL(string: FinalVars.getMobileRequestURL() + link)!)
request.httpMethod = "POST"
request.timeoutInterval = FinalVars.getRequestTimeoutIntervalInSeconds() //=7 Set Timeout in Seconds
request.httpBody = postString.data(using: String.Encoding.utf8)

let task = URLSession.shared.dataTask(with: request as URLRequest) { data, response, error in
guard error == nil && data != nil else {
//TimeOutReached --> No Network Connection
print("error=\(String(describing: error))")

DispatchQueue.main.async(execute: {
completionHandler("-1" as AnyObject)
})
return
}

if let httpStatus = response as? HTTPURLResponse , httpStatus.statusCode != 200 { // check for http errors
print("statusCode should be 200, but is \(httpStatus.statusCode)")
print("response = \(String(describing: response))")
}

//JSON successfull
do {

let parseJSON = try JSONSerialization.jsonObject(with: data!, options: .allowFragments)

DispatchQueue.main.async(execute: {
completionHandler(parseJSON as AnyObject)
});


} catch let error as NSError {
print("Failed to load: \(error.localizedDescription)")

}
}
task.resume()
}

最佳答案

你应该有一条线来保证安全......

if teams.count > 0  { .. do your stuff ... } else { .. do nothing - there are no teams .. }

假设此后不久您的团队数组被填充,上面的行将帮助确保一切正常,直到网络响应用您的数据回复,然后一切都会很好。希望这会有所帮助。

关于ios - Swift 远程搜索使 Tableview 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48500947/

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