2017-04-18 11 views
0

Swift3、Alamofire、AlamofireImageを試してみる。私はいくつかのInstagram画像をテーブルビューに表示しようとしています。私はこのようになりAlamofireを使用して取得場所data.jsonファイルがあります:URLから複数の画像を取得して表示する

{ 
    "places" : [ 
    { "name" : "place1", "url" : "http://instagramImage1.jpg" }, 
    { "name" : "place2", "url" : "http://instagramImage2.jpg" }, 
    { "name" : "place3", "url" : "http://instagramImage3.jpg" }, 
    ] 
} 

私が持っているセットアップPlaceTableViewCellUIImageViewとし、対応するコントローラ内のコンセントにそれを取り付けました。

私も含まれPlaceTableViewControllerあります

loadJson() 

と機能は次のようになります:

private func loadJson() { 
    Alamofire.request("https://example.com/data.json").responseJSON { response in 
     if let JSON = response.result.value as? [String : Any], 
      let places = JSON["places"] as? [[String : String]] { 
      for place in places { 
       //should I call loadImage() function here? 
      } 
     } 
    } 
} 

I私はプライベート関数を呼び出すviewDidLoad()方法で

var places = [Place]() //empty array to store places 

をJSONファイルの各場所のモデルもあります:

import UIKit 

class Place { 

    var name: String 
    var url: String 

    init?(name: String, url: String) { 
     self.name = name 
     self.url = url  
    } 

} 

QUESTION

私はどこここから行くのか分かりません。私は自分のプロジェクトに含まれているAlamofireImageを使って各画像をダウンロードしたいと思いますが、これを何らかのループで行うことはできますか?私はまた、新しいテーブルの行に各画像を表示したいと思います。アドバイスやコード例は非常に高く評価されます。

+1

行の各セルに、AlamofireImageでイメージをロードします。 'loadJSON()'でそれを行うと、すべての画像をプリフェッチしますが、それは本当ですが、ユーザがスクロールせずに各画像を見ると、何もプリフェッチしません。 – Larme

答えて

1

私はloadJSONに画像を取り込むないことをお勧めします。

なぜですか?

  • は最初の要求に戻ってくる大量の写真があるかもしれませんし、ユーザーがさえ十分にそれらのいくつかを見るために、アプリケーションにスクロールダウンしないことがあります。あなたは同時に、あまりにも多くのリクエストを初期化する場合は、他の要求が完了するのを待っている間

    その上で
  • 、要求の一部がタイムアウトすることがあります。これはおそらく最良の解決策ではありません。

だから今解決に向かいます。ユーザーが表示しようとしているセルのみのイメージ・データをダウンロードすることは理にかなっています。

TableView

optional func tableView(_ tableView: UITableView, 
     willDisplay cell: UITableViewCell, 
      forRowAt indexPath: IndexPath) 

画像をロードするために、このメソッドを使用し、この目的のためのデリゲートメソッドを持っています。

extension ViewController: UITableViewDelegate { 
    func tableView(_ tableView: UITableView, 
     willDisplay cell: UITableViewCell, 
      forRowAt indexPath: IndexPath) { 

    let photoURL = places[indexPath.row].url 

    // fetch this photo from web using URL 

    // get the table view cell and update the image 
    if let cell = self.tableView.cellForRow(at: indexPath) as UITableViewCell { 
     cell.imageView.image = //fetchPhoto 
    } 
    } 
} 
+0

ありがとうございます。 'places.count'はnumberOfRowInSectionを設定しようとすると私に0を与えます。行数を設定する前にJSONデータを取得する方法を知りたいですか? – tommyd456

+0

'loadJson()'関数の最後に 'self.tableView.reloadData()'を置くことを考えていましたか? – tommyd456

+0

この場合、mainQueueでイメージを更新する場合は、データをリロードする必要はありません。 – Rahul

0

テーブルビューコントローラーで以下のコードを使用して、セルに画像を取り込むことができます。そのためには、tableviewで1つのセルを作成するか、xibでカスタムセルを作成する必要があります。私のコードは、xibからカスタムセルをロードするためのものです。

//MARK:- TableView Delegate and DataSource 
func tableView(_ tableView: UITableView, numberOfRowsInSection sectionIndex: Int) -> Int { 
    return places.count 
} 

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 
    return 200//or cell height you want 
} 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    var cell = tableView.dequeueReusableCell(withIdentifier: "PlaceCell") as? PlaceCell 
    if cell == nil { 
     cell = (loadFromNibNamed(viewClass: PlaceCell.self) as! PlaceCell) 
    } 

    cell?.ivCategory.af_setImage(withURL: URL(string: places[indexPath.row].url)) 
    return cell! 
} 

また、apiから応答を受け取ると、tableviewをリロードする必要があります。

+0

ありがとうございます。私は実際にxibファイルを使用していない。私は私の質問で言及すべきだった。 – tommyd456

関連する問題