2017-05-24 5 views
1

iOSアプリケーションのリモートデータを含むテーブルビューを構築しています。私はAlamoFireとSwiftyJSONを使用して、一連のエピソードでJSONファイルを読み込みます。だから私はのviewDidLoadからAlamofireを使用してJSONのURLを使用して画像を読み込む

getEpisodes(url: endpoint) 

呼び出す

{ 
    "id": "456", 
    "name": "EpOne", 
    "description": "Episode description 1", 
    "imageURL": "http://myimage.com/myimagefile1.jpg" 
}, 
{ 
    "id": "789", 
    "name": "Eptwo", 
    "description": "Episode description 2", 
    "imageURL": "http://myimage.com/myimagefile2.jpg" 
} ... 

JSONファイルは、次のように構成されています。これは、次のことを実行します:

func getEpisodes(url: String) { 
    Alamofire.request(url, method: .get).validate().responseJSON { response in 
     switch response.result { 
     case .success(let value): 
      let json = JSON(value) 
      self.buildEpisodeArray(json: json) 

     case .failure(let error): 
      print(error) 
     } 
    } 
} 

func buildEpisodeArray(json: JSON) { 
    if let allEpisodes = json["episodes"].array { 
     for singleEpisode in allEpisodes { 
      let currentEpisode = Episode() 
      currentEpisode.name = singleEpisode["name"].string! 
      currentEpisode.imageURL = singleEpisode["imageURL"].string! 
      episodes.append(currentEpisode) 
     } 
    } 
    tableView.reloadData() 
} 

その後、私はすべてが正常に動作します。この時点で私の細胞

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cellIdentifier = "Cell" 
    let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as! EpisodeCell 
    cell.nameLabel.text = episodes[indexPath.row].name 

    // TODO Get the image 

    return cell 
} 

にデータをロードします。問題は、画像をロードしようとするときです。私はいくつかのチュートリアルをチェックしました(私はこれで少し新しくなりました).Alamofireでデータを取得した後、contentsOf:urlを使って画像を取得します。私の場合、私が代わるので、これは、画像をロードしますが、テーブルビューがメガ遅い

// Get the image 
    if let url = NSURL(string: episodes[indexPath.row].imageURL), 
     let data = NSData(contentsOf: url as URL) { 
     cell.episodeImage.image = UIImage(data: data as Data) 
    } 

で「// TODOは、画像を取得します」。しかし、contentsOf:urlを使用しないと、alamofireでデータをロードする利点がありません(これが私が上下にスクロールするとテーブルが遅いのはなぜかと思います)。

イメージを非同期で読み込んではいけませんか?もしそうなら、それぞれの画像に対して別々のAlamofire.requestを作成しますか?

Alamofireやその他のものでデータをロードするためのチュートリアルがありますが、データを読み込んでロードする場合はどうすればいいですか?

ご協力いただきありがとうございます。

答えて

1

私はSDWebImageを使用するために、あなたをお勧めしますが、それはまた、箱から出して画像のキャッシュを処理します。 https://github.com/rs/SDWebImage

基本的にそれを使用することは非常に簡単です:

import SDWebImage 

// Get the image 
cell.episodeImage.sd_setImage(with: URL(string: episodes[indexPath.row].imageURL)) 
+0

おかげで、素晴らしい仕事しました! :D – cesarcarlos

関連する問題