2017-04-18 6 views
0

Swift3, Alamofire 및 AlamofireImage로 실험합니다. 일부 Instagram 이미지를 tableview에 표시하려고합니다. I는 다음과 같이 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 : I 전용 함수 호출

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

방법 viewDidLoad()에서 :

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 또한 JSON 파일의 각 위치에 대한 모델을 가지고 있습니다 :

import UIKit 

class Place { 

    var name: String 
    var url: String 

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

} 

질문

나는 당장은 확실하지 않다. 나는 내 프로젝트에 포함되어있는 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에서 하나의 셀을 생성하거나 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