2017-06-15 9 views
1

今、私はGoogle Places APIを使用して、ユーザーの近くにある場所の一覧をダウンロードしています。 JSONレスポンスを取得すると、それを解析して、テーブルビューを生成するための場所の配列を作成します。以前は、画像を同期して読み込んでいたため、テーブルビューの読み込み時間が長くなりすぎました。私は以来、非同期の負荷を追加しましたが、テーブルビューが読み込まれる場所で問題が発生しますが、最初に表示されたセルは、画像のダウンロードが完了した後で更新されず、スクロールしてからバックアップした画像表示(最初のいくつかの可視の下のすべての場所に写真が読み込まれています)。私の場所オブジェクトの非同期呼び出しの中でtableViewをリフレッシュする方法があれば、それはおそらくそれを助けるだろうが、私は多くの時間が良い練習であるか、よりきれいな方法がある場合、tableViewをリロードするかどうかはわかりません。スウィフトUITableViewで画像を読み込む非同期 - 上部のセルに画像がありません

私はiOS開発に比較的新しいので、誰かが私がこれをやっているやり方とは異なるアプローチをしているなら、それを聞いてみたいと思います。

は、配列形式に場所を取得する:私が代わりに非同期で画像を自分自身をダウンロードしようとしているのSDWebImage(https://github.com/rs/SDWebImage)を使用して、私の問題を解決した

init(name: String, desc: String, imageRef: String) { 
     self._desc = desc 
     self._imageURL = imageURL 
     self._name = name 

     if let url = NSURL(string: "https://maps.googleapis.com/maps/api/place/photo?maxwidth=150&photoreference=\(imageRef)&key={MyKey}") { 
      DispatchQueue.global().async { 
       if let data = NSData(contentsOf: url as URL) { 
        DispatchQueue.main.async { 
         self.image = UIImage(data: data as Data) 
        } 
       } 
      } 
     } 

答えて

0

let task = URLSession.shared.dataTask(with: url!) {(data, response, error) in 
do{ 
    print("\n Starting JSON Parsing \n") 
    if let json = try JSONSerialization.jsonObject(with: data!) as? AnyObject{ 
     if let results = json["results"] as? NSArray{ 
      print("\(results.count)") 
      for case let result as NSDictionary in results{ 
       let item = result 
       let name = item["name"] 

       if let name = name, 
        let id = item["id"], 
        let photos = item["photos"] as? NSArray, 
        let photo = photos.firstObject as? NSDictionary, 
        let photoRef = photo["photo_reference"] { 
        let place = Place(name: "\(name)", desc: "\(id)", imageRef: "\(photoRef)") 
        self.placeList.append(place) 
       } 
       else { 
        print("\n\n \(name) \n\n") 
       } 
      } 
      self.placeList.sort(by: {$0.name > $1.name}) 

      DispatchQueue.main.async { 
       self.tableView.reloadData() 
      } 
     } 
    } 
} 
catch { 
    print("Error deserializing JSON: \(error)") 
} 

場所は、初期化子オブジェクト。それは非常にシンプルで非常に速かった、また、画像ロード中に良い進捗インジケータを提供する

関連する問題