2017-02-10 7 views
0

私は、JSONのデータを取得した後、私のtableViewがあまりにも早くリロードされているという奇妙な問題に遭遇しています。奇妙なことは、データを取得する前に、必要なすべてのデータをtableViewに書き込んだり、リロードした後にリロードしたりすることがあります。私は、データがnilとして返されることがあることに気付いていますが、これがなぜこのように行われているかは完全にはわかりません。テーブルビューの再読み込みが遅すぎる

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 THIS-を使用してテーブル全体の代わりに来るようあなたは、個別の細胞をリロードすることができます。

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() 
    }) 

を使用する必要がありますね。

関連する問題