2017-06-15 115 views
1

現在我正在使用Google Places API在用戶附近下載徑向地點列表。當我得到JSON響應時,我解析它並創建一個用於填充表視圖的位置數組。以前,我同步加載圖像,使得tableview的加載時間過長。我已經添加了異步加載,但是,加載表視圖時出現問題,但在圖像下載完成後最初顯示的單元格不會刷新,只有當我滾動傳遞它們然後備份時纔會刷新圖像顯示(前幾個可見的所有地方都已加載圖片)。如果有一種方法可以在我的場景對象的異步調用中刷新tableView,那可能會有所幫助,但我不確定是否重新加載多次是最佳實踐的tableView或者是否有更乾淨的方式。Swift在UITableView中異步加載圖像 - 頂部單元格沒有圖片

我對iOS開發比較陌生,所以如果任何人有不同的方法來做這件事,我很樂意聽到它。

獲取放入數組格式:

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)") 
} 

鄰居對象初始化:

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) 
        } 
       } 
      } 
     } 

回答