2015-06-09 4 views
3

Я пытаюсь выполнить вызов tableView.reloadData() после запроса async, который я вызываю, чтобы заполнить мой UITableView. Таблица отображает данные через 15-20 секунд, если только я не начну вручную прокрутку, и в этом случае все сразу загрузится. Таким образом, данные, безусловно, есть, он просто не загружается должным образом. Что я могу сделать, чтобы решить эту проблему?Swift: tableView.reloadData() слишком медленно

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 
      } 
      } 
     } 
    }) 
} 
} 
+0

Кто является источником данных для вашего стола? – Icaro

+0

Это все в классе: SongViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {} ' – chicobermuda

ответ

4

Проблема заключается в том, что вы устанавливаете jsonLoadedна фоне потока. Это означает, что reloadData() также называется фоновым потоком. Но вы должны никогда поговорите с интерфейсом на фоне потока! Вам нужно выйти в основной поток, прежде чем делать что-нибудь, которое включает в себя общие данные (например, jsonLoaded) или интерфейс.

+1

действительно! dispatch_async (dispatch_get_main_queue()) {} – ggez44

Смежные вопросы