2017-01-23 7 views
1

ImはJSONからの画像リンクをダウンロードして、テーブルビューは、その細胞の作成を開始後、画像を作成する:更新表のセルの画像を非同期

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

     let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! TableViewCellController 

      DispatchQueue.main.async(execute: {() -> Void in 

       if let url = NSURL(string: self.movies[indexPath.row].image) 
       { 

        if let data = NSData(contentsOf: url as URL) 
        { 
         let imageAux = UIImage((data: data as Data)) 
         cell.movieImage.image = imageAux 
         self.tableView.reloadData() 

        } 
       } 
      }) 

     cell.name = self.movies[indexPath.row].name 
     cell.date = self.movies[indexPath.row].date 
     return cell 
} 

そして、これはうまく動作しますが、テーブルビューが本当に遅くなりますレンダリングではなく、スクロール時に使用します。私はRAMとCPUをチェックし続け、両方とも実際には低いですが、私のネットワーク使用量は増え続けますが、イメージはすでにセルに載っていますので、すでに完了していることを意味します。 (このテストでは、JSONを2つの映画だけに呼び出すため、2つのイメージ)

これを実行する前に、私の合計ダウンロードは約200kb(イメージあり)でした。

何が間違っていますか?

答えて

3

バックグラウンドアクティビティ用に別のキューを指定することをお勧めします。

NSData(contentsOf: url as URL)

これは、UIを「凍結」されたものである。この例では、あなたの重いネットワークタスクがです。最善の解決策は、DispatchQueue.backgroundのようなものを定義し、あなたのディスプレイをロックしないようにし、後でメインスレッドに戻ってUIタスクを実行しながら、ネットワークが、そこに呼び出しを実行するために、次のようになります。

DispatchQueue.background.async(execute: {() -> Void in 
    if let url = NSURL(string: self.movies[indexPath.row].image) { 
     //Do this network stuff on the background thread 
     if let data = NSData(contentsOf: url as URL) { 
      let imageAux = UIImage(data: data as Data) 
      //Switch back to the main thread to do the UI stuff 
      DispatchQueue.main.async(execute: {() -> Void in 
       cell.movieImage.image = imageAux 
      } 
     } 
    } 
}) 

が、この場合、私に教えてください理にかなっている。

+0

ありがとうございます!もう一つの問題は、テーブルをリロードする必要がないということでした。画像はダースをダウンロードしていました(種類は明らかですが、最初はそれを見ませんでした)。 ありがとうマイケル! – Adrian

+0

マイケルフォーレ私はこれが問題ではないことを知っていますが、私は問題があることを認識しています。私はdequeueReusableCellを使用しているので、セルを上下にスクロールして画像を再度ダウンロードします。ありがとう! – Adrian

+2

私は 'NSCache'ドキュメントに@Adrianの画像をキャッシュします。それは非常に使いやすいです。別の質問を投稿した場合、私のUIImageキャッシングコードのスニペットを例として追加することができます。 –

関連する問題