2017-02-10 63 views
0

我运行到哪里我tableView被检索JSON数据之后太早重装一个奇怪的问题。奇怪的是,有时它会在获取所有必需的数据以填充tableView和其他可重新加载数据之前重新加载,然后才能获取数据。我不完全确定它为什么这样做,但我注意到有时数据返回为零。下面是我用来检索数据:的TableView重装太早

var genreDataArray: [GenreData] = [] 
    var posterStringArray: [String] = [] 
    var posterImageArray: [UIImage] = [] 

    override func viewDidLoad() { 
    super.viewDidLoad() 

    GenreData.updateAllData(urlExtension:"list", completionHandler: { results in 

     guard let results = results else { 
     print("There was an error retrieving genre data") 
     return 
     } 
     self.genreDataArray = results 

     for movie in self.genreDataArray { 

     if let movieGenreID = movie.id 
     { 
      GenrePosters.updateGenrePoster(genreID: movieGenreID, urlExtension: "movies", completionHandler: {posters in 

      guard let posters = posters else { 
       print("There was an error retrieving poster data") 
       return 
      } 
      for poster in posters { 

       if let newPoster = poster { 
       if self.posterStringArray.contains(newPoster){ 
        continue 
       } else { 
        self.posterStringArray.append(newPoster) 

        self.networkManager.downloadImage(imageExtension: "\(newPoster)", 
        { (imageData) 
         in 
         if let image = UIImage(data: imageData as Data){ 
         self.posterImageArray.append(image) 
        } 
        }) 
        break// Use to exit out of array after appending the corresponding poster string 
       } 
       } else { 
       print("There was a problem retrieving poster images")//This gets called sometimes if the poster returns nil 
       continue 
       } 
      } 
      }) 

     } 
     } 
     DispatchQueue.main.async { 
     self.genresTableView.reloadData()//This is reloading too early before the data can be retrieved 
     } 
    }) 
    } 
+2

你有意不在你的完成块中包含'reloadData()'吗?检索很可能是异步完成的,因此在完全获取数据之前可能会重新加载数据。 –

回答

1

数据异步检索,因此您的表视图有时可以重新加载没有所有的数据。你可以做的是有表视图重装在异步数据检索结束时,也可以单独重新加载细胞,因为它们使用

let indexPath = IndexPath(item: rowNumber, section: 0) 
tableView.reloadRows(at: [indexPath], with: .top) 
+0

我之前没有看到过这样做,我会给它一个镜头 – SwiftyJD

+0

您只需确保在重新载入该单元格之前获得了该单元格的数据 –

0

TRY这个 - 进来,而不是整个表的:

var genreDataArray: [GenreData] = [] 
     var posterStringArray: [String] = [] 
     var posterImageArray: [UIImage] = [] 

    override func viewDidLoad() { 
     super.viewDidLoad() 

    genredataArray.removeAll() 
    posterStringArray.removeAll() 
    posterImageArray.removeAll() 

        NOW HERE CALL YOUR CLASS FUNCTION AS ABOVE  
     } 
0

我想在这种情况下,你应该使用

dispatch_async(dispatch_get_main_queue(),{ 
    for data in json as! [Dictionary<String,AnyObject>] 
    { 
    //take data from json. . . 
    } 
    //reload your table -> tableView.reloadData() 
    }) 

你应该得到的安全线的主队列。