Swift:tableView.reloadData() 太慢了

Posted

技术标签:

【中文标题】Swift:tableView.reloadData() 太慢了【英文标题】:Swift: tableView.reloadData() way too slow 【发布时间】:2015-08-23 17:06:01 【问题描述】:

我正在尝试在我调用以填充我的UITableView 的异步请求之后执行tableView.reloadData() 调用。该表会在 15-20 秒后显示数据,除非我手动开始滚动,在这种情况下它会立即加载。所以数据肯定在那里,只是没有正确加载。我该怎么做才能解决这个问题?

var jsonLoaded:Bool = false 
        didSet 
            if jsonLoaded 

                tableView.reloadData()

            
        
    

override func viewDidLoad() 
        super.viewDidLoad()

let url = NSURL(string: "https://www.googleapis.com/youtube/v3/search?part=id&q=\(searchTerm)&maxResults=1&key=AIzaSyD7PxAoq0O5hUxx775l_E_mnowlU4cUfcI")

            let task = NSURLSession.sharedSession().dataTaskWithURL(url!, completionHandler: data, response, error -> Void in

                if error != nil 

                    println(error)

                 else 

                    let jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as! NSDictionary

                    if let items = jsonResult["items"] as? NSArray 
                        for songs in items 
                            if let id = songs["id"] as? NSDictionary 
                                if let videoId = id["videoId"] as? String 
let newURL = NSURL(string: "https://www.googleapis.com/youtube/v3/search?relatedToVideoId=\(videoId)&part=snippet&type=video&maxResults=6&key=AIzaSyD7PxAoq0O5hUxx775l_E_mnowlU4cUfcI")

                                    let newTask = NSURLSession.sharedSession().dataTaskWithURL(newURL!, completionHandler: data, response, error -> Void in

                                        if error != nil 

                                            println(error)

                                         else 

                                            let newJsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as! NSDictionary
                                            if let info = newJsonResult["items"] as? NSArray 
                                                for videos in info 
                                                    if let snippet = videos["snippet"] as? NSDictionary 
                                                        if let title = snippet["title"] as? String 
                                                           self.recommendedTitles.append(title)
                                                           self.jsonLoaded = true

                                                     
                                                
                                            
                                      
                                  )
                                  newTask.resume()
                              
                          
                     
                 jsonLoaded = false
             
          
      
  )


【问题讨论】:

谁是你的表的数据源? 一切尽在class: SongViewController: UIViewController, UITableViewDelegate, UITableViewDataSource 【参考方案1】:

问题是您将jsonLoaded 设置在后台线程上。这意味着reloadData() 也在后台线程上被调用。但是您必须永远在后台线程上与界面对话!在执行任何涉及共享数据(例如jsonLoaded)或接口的事情之前,您需要先跳到主线程。

【讨论】:

确实! dispatch_async(dispatch_get_main_queue())

以上是关于Swift:tableView.reloadData() 太慢了的主要内容,如果未能解决你的问题,请参考以下文章

Swift入门系列--Swift官方文档(2.2)--中文翻译--About Swift 关于Swift

swift 示例BS swift.swift

swift swift_bug.swift

ios 整理(一)swift和oc的区别

swift swift_extension5.swift

swift swift_optional4.swift