Swift 远程搜索使 Tableview 崩溃

Posted

技术标签:

【中文标题】Swift 远程搜索使 Tableview 崩溃【英文标题】:Swift remote Search crashes Tableview 【发布时间】:2018-01-29 12:10:18 【问题描述】:

嘿,我有一个表格视图,上面有一个搜索栏。我请求一个带有搜索词的远程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 但 teams 数组为空。所以我认为如果用户在函数清除数组但尚未重新加载表格视图的那一刻点击单元格,就会发生这种情况。有什么想法可以解决这个问题吗?

编辑: 有兴趣的正在加载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() 

【问题讨论】:

什么是loadingJSON?可以出示一下代码吗? 更新了我的问题... 因此,在我看来,您的代码中不应该存在多线程问题。但也许你应该通过NSLog在完成闭包和tableView(_:cellForRowAt:)中输入一些输出来确保这一点,只是为了确保它们在同一个线程上运行。我想tableView(_:numberOfRowsInSection:) 返回self.teams.count,对吗? 【参考方案1】:

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

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

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

【讨论】:

完成了,但没有奏效。该应用程序有时仍然崩溃。我已经用计时器完成了,这个答案中的链接:***.com/a/38987761/6003494

以上是关于Swift 远程搜索使 Tableview 崩溃的主要内容,如果未能解决你的问题,请参考以下文章

UISearchBar、textDidChange 事件、MultipleNSUrlConnection、tableView 崩溃

使用致命错误刷新tableview时应用程序崩溃:索引超出范围Swift3

IOS Swift Master Detail Application, managed object, tableView: endUpdates() 调用configureCell() 但崩溃,r

当我在按钮操作上从 TableView 中删除单元格时,应用程序崩溃了 - iOS Swift

在 Swift 中使用远程 JSON 数据填充 tableView

如何在 Swift 中同步表格视图和搜索栏选择?