更新tableview会导致滞后和警告

时间:2015-10-29 23:03:44

标签: ios swift uitableview tableview

我有一个数组,其中包含从获取请求中检索的数据。在我的tableview上方,我有一个按钮,用过滤器启动另一个获取请求。每当我点击按钮时,我都会清空包含前一个获取请求中的文件的数组,这也是我用来引用numberOfRowInSection的数组。然后用新请求中的数据填充该数组。这是有效的,但是当我点击按钮并且表视图重新加载新数据之间存在巨大的延迟。

然后我收到警告"此应用程序正在从后台线程修改autolayout引擎,这可能导致引擎损坏和奇怪的崩溃。这将在将来的版本中引发异常。"

我在另一篇文章中读到了我需要实施的dispatch_async,但我不知道在哪里:

dispatch_async(dispatch_get_main_queue(), {
// code here
})

剩余代码:

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {       
        return self.recordings.count

}

@IBAction func publicButtonPressed(sender: AnyObject) {

    self.recordings.removeAll()
    let task = session.dataTaskWithRequest(request, completionHandler: { (data, response, error) -> Void in

        do {
            let dict = try NSJSONSerialization.JSONObjectWithData(data, options: .MutableLeaves) as? NSDictionary
            self.fetchedArray = dict!["recordings"] as? NSArray
            print("fetched array count \(self.fetchedArray!.count)")

            if let jsonArray: NSArray = self.fetchedArray {

                for var i=0; i<jsonArray.count; ++i {

                    let dictResult = jsonArray.objectAtIndex(i) as! NSDictionary

                    let recording = Recordings()
                    recording.trackURL = dictResult["url"] as? String
                    self.recordings.append(recording)                    
                }  
            }
            else
            {
                // No error thrown, but no NSDictionary
            }
            self.audioTable.reloadData()
        }
        catch let parseError {
            // Log the error thrown by `JSONObjectWithData`
        }

    })        
    task.resume()
}

1 个答案:

答案 0 :(得分:0)

与UI有关的任何事情都需要在主线程上。在您的代码中,这将是reloadData调用。因此,修改代码以将reloadData包含在dispatch_async

dispatch_async(dispatch_get_main_queue(), {
  self.audioTable.reloadData()
})