表格视图中的Swift Google地方信息

时间:2018-07-10 01:34:36

标签: swift uitableview google-places-api

我想做的是创建一个tableView,它具有从Google的Place api提取的一堆不同餐厅的名称。 Google建议获取我能做的place_id,并使用该place_id来获取我能做的餐馆的名称。我遇到的问题是将餐厅名称放入tableView中,我需要一个位于函数外部的数组,因此我将使用place_id获得的地名附加到函数外部的数组中。一切都很好,并且编译时没有错误,只是在应用加载时tableView为空,我使用了一条print语句进行检查,并指出该数组为空。

这是代码:

import UIKit
import Firebase
import GooglePlaces
import GoogleMaps
import Firebase
import Alamofire
import SwiftyJSON

class MainViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {


@IBOutlet weak var tableView: UITableView!

var placesClient: GMSPlacesClient!



var arrayedName = [String]()


var http = "https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=41.392788,-73.450949&radius=5000&type=restaurant&key=KEY_HERE"

override func viewDidLoad() {
    super.viewDidLoad()
    tableView.dataSource = self
    tableView.delegate = self
    placesClient = GMSPlacesClient.shared()
   other()
}


func other() {
    Alamofire.request(http).responseJSON { (responseData) -> Void in
        if ((responseData.result.value) != nil) {
            let swiftyJsonVar = JSON(responseData.result.value!)
            let results = swiftyJsonVar["results"].arrayValue
            for result in results {
                let id = result["place_id"].stringValue
                var arrayed = [String]()
                arrayed.append(id)
                for i in 0..<arrayed.count {
                    let array = arrayed[i]
                    self.placesClient.lookUpPlaceID(array, callback: { (place, error) -> Void in
                        if let error = error {
                            print("Lookup place id query error: \(error.localizedDescription)")
                            return
                        }
                        guard let place = place else {
                            print("No place details for \(arrayed[i])")
                            return
                        }

                        let placeName = place.name
                        self.arrayedName.append(placeName)
                    })
                }
            }
        }
    }
}


func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}


func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return arrayedName.count

}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! LocationTableViewCell
    cell.nameLbl.text = "\(arrayedName[indexPath.row])"
    return cell
 }

}

无论我做什么,我都无法填充数组。我检查了信息plist,并找到了所有需要的东西,但是我认为问题出在other()函数中。我尝试过的另一件事是从other()函数重新创建代码,并将其添加到cellForRowAt,但是它崩溃了。看起来像这样:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! LocationTableViewCell
        Alamofire.request(http).responseJSON { (responseData) -> Void in
            if ((responseData.result.value) != nil) {
                let swiftyJsonVar = JSON(responseData.result.value!)
                let results = swiftyJsonVar["results"].arrayValue
                for result in results {
                    let id = result["place_id"].stringValue
                    var arrayed = [String]()
                    arrayed.append(id)
                    for i in 0..<arrayed.count {
                        let array = arrayed[i]
                        self.placesClient.lookUpPlaceID(array, callback: { (place, error) -> Void in
                            if let error = error {
                                print("Lookup place id query error: \(error.localizedDescription)")
                                return
                            }
                            guard let place = place else {
                                print("No place details for \(arrayed[i])")
                                return
                            }

                            let placeName = place.name

                            var arrayName = [String]()
                            arrayName.append(placeName)
                            cell.nameLbl.text = "\(arrayName[indexPath.row])"

                        })
                    }
                }



            }
        }
        return cell
    }

我不知道该怎么办。如果有人可以帮助我,我很感激。如果还有其他我可以回答的问题,请询问。 谢谢

1 个答案:

答案 0 :(得分:1)

arrayedName最初是空的,因此您不会在tableView中看到任何项目。但是,所有地名都附加到此数组后,您需要重新加载tableView才能看到新数据。您应将cellForRowAt与第一次尝试时的尝试保持一致,而无需任何API调用。我已经更新了other方法,如下所示,现在它应该可以工作

func other() {
    Alamofire.request(http).responseJSON { (responseData) -> Void in
        if ((responseData.result.value) != nil) {
            let swiftyJsonVar = JSON(responseData.result.value!)
            let results = swiftyJsonVar["results"].arrayValue

            let dispatchGroup = DispatchGroup()

            for result in results {
                let id = result["place_id"].stringValue

                dispatchGroup.enter()

                self.placesClient.lookUpPlaceID(id, callback: { (place, error) -> Void in
                   if let error = error {
                      print("Lookup place id query error: \(error.localizedDescription)")
                      dispatchGroup.leave()
                      return
                   }
                   guard let place = place else {
                      print("No place details for \(id)")
                      dispatchGroup.leave()
                      return
                   }

                   self.arrayedName.append(place.name)
                   dispatchGroup.leave()
               })
           }
           dispatchGroup.notify(queue: DispatchQueue.global()) {
              self.tableView.reloadData()
           } 
        }
    }
}