Ich habe einige String-Suche in meiner Datenbank gemacht und ich gebe den JSON zurück, nachdem der Benutzer das dritte Zeichen auf Suchleiste drückt, danach füge ich alle Ergebnisse an ein Array und es füllt eine Tabellenansicht mit Daten.Swift Suchleiste - Aktualisieren der Tabellenansicht mit Alamofire Anfrage
Obwohl ich ein Problem habe. Wenn ich für mens
können sagen, suchen erhalte ich die Ergebnisse auf dem Tableview erscheinen
Wenn ich den ganzen Text löschen und ich schreiben Frauen, die alle gut ... aber wenn ich ein paar Strings etc ich einen Fehler zu löschen bin index out of range
innen die Tabellenansicht cellForRowAt. Ich denke, dass es kaputt ist, weil die Tabellenansicht nicht die Zeit hat, das angehängte Array zu bekommen und die Zellen zu füllen.
Was ich herausfinden möchte ist, wie kann ich es machen, ohne eine Zeitverzögerung auf die Abfrage oder in der reloadData()
. Der Grund, warum ich keine Zeitverzögerung möchte, liegt darin, dass ein Benutzer ein langsames altes iPhone haben könnte und sogar mit 2 Sekunden Verzögerung könnte es abstürzen.
Dies ist mein Code
class SearchViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UISearchBarDelegate, UISearchControllerDelegate{
@IBOutlet weak var searchResultTable: UITableView!
let searchController = UISearchController(searchResultsController: nil)
var filteredData = [Products]()
override func viewDidLoad() {
super.viewDidLoad()
self.navigationController?.isNavigationBarHidden = true
searchController.searchResultsUpdater = self
searchController.dimsBackgroundDuringPresentation = false
definesPresentationContext = true
searchResultTable.tableHeaderView = searchController.searchBar
searchController.searchBar.delegate = self
}
func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
searchBar.resignFirstResponder()
}
func getSearch(completed: @escaping DownloadComplete, searchString: String) {
if filteredData.isEmpty == false {
filteredData.removeAll()
}
let parameters: Parameters = [
"action" : "search",
"subaction" : "get",
"product_name" : searchString,
"limit" : "0,30"
]
Alamofire.request(baseurl, method: .get, parameters: parameters).responseJSON { (responseData) -> Void in
if((responseData.result.value) != nil) {
let result = responseData.result
if let dict = result.value as? Dictionary<String, AnyObject>{
if let list = dict["product_details"] as? [Dictionary<String, AnyObject>] {
for obj in list {
let manPerfumes = Products(productDict: obj)
self.filteredData.append(manPerfumes)
}
}
}
completed()
}
}
}
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView,
heightForRowAt indexPath: IndexPath) -> CGFloat {
return 170
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return filteredData.count
}
func tableView(_ tableView: UITableView,
cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell:iPhoneTableViewCell = tableView.dequeueReusableCell(withIdentifier: "iPhoneTableCell", for: indexPath) as! iPhoneTableViewCell
let prods = self.filteredData[indexPath.row] //HERE I GET THE ERROR
cell.configureCell(products: prods)
return cell
}
}
extension SearchViewController: UISearchResultsUpdating {
func updateSearchResults(for searchController: UISearchController) {
if (searchController.searchBar.text?.characters.count)! >= 3 {
self.getSearch(completed: {
self.searchResultTable.reloadData()
self.searchResultTable.setContentOffset(CGPoint.zero, animated: true)
}, searchString: searchController.searchBar.text!)
} else {
self.searchResultTable.reloadData()
}
}
}