Google地图,使用DispatchQueue加载标记

时间:2017-05-10 19:37:40

标签: ios swift google-maps swift3

我使用dispatch添加ViewControllerAnotherViewController的标记

我正在使用:

ViewTypeViewController

class ViewTypeViewController: UIViewController {

    var places = [PlaceModel]()

    override func viewDidLoad() {
        super.viewDidLoad()


        DispatchQueue.main.async(execute: {
            print("Run on background thread!!!")
            self.places.append(PlaceModel(_id: 0, _name: "Park", _lat: 34.1331168, _lng: -118.3550723, _icon: "i01" ) )
            self.places.append(PlaceModel(_id: 1, _name: "Library", _lat: 34.1251168, _lng: -118.3590723, _icon: "i02"))
            let mapVC = self.storyboard!.instantiateViewController(withIdentifier: "MapVC") as! MapViewController
            mapVC.places = self.places
            mapVC.callerLoaded = true
            mapVC.load()
        })        
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

的MapViewController

class MapViewController: UIViewController, GMSMapViewDelegate {


    @IBOutlet weak var mapView: GMSMapView!
    @IBOutlet weak var containerDetail: UIView!
    @IBOutlet weak var placeName: UILabel!
    @IBOutlet weak var logo: UIImageView!
    @IBOutlet weak var stars: HCSStarRatingView!

    var places = [PlaceModel]()
    var markerDict: [Int: GMSMarker] = [:]
    var selected: Int = 0

    var callerLoaded: Bool = false
    var mapLoaded: Bool = false

    var zoom: Float = 15

    override func viewDidLoad() {
        super.viewDidLoad()

        mapView.delegate = self

        containerDetail.isHidden = true
        containerDetail.layer.borderWidth = 0.5
        containerDetail.layer.borderColor = UIColor.gray.cgColor

        logo.setRounded()

        let camera = GMSCameraPosition.camera(withLatitude: 34.1381168, longitude: -118.3555723, zoom: zoom)
        self.mapView.camera = camera

        do {
            if let styleURL = Bundle.main.url(forResource: "style", withExtension: "json") {
                mapView.mapStyle = try GMSMapStyle(contentsOfFileURL: styleURL)
            } else {
                NSLog("Unable to find style.json")
            }
        } catch {
            NSLog("One or more of the map styles failed to load. \(error)")
        }

    }


    func load(){

        var index: Int = 0

        for place in places {
            let marker = GMSMarker()
            marker.position = CLLocationCoordinate2D(latitude: place.lat, longitude: place.lng)
            marker.title = place.name
            marker.snippet = place.name
            marker.appearAnimation = kGMSMarkerAnimationPop
            marker.map = self.mapView
            markerDict[place.id] = marker
            index = index + 1
        }
    }

}

load中的方法MapViewController已正确加载,但是,marker已添加到map

我没有收到任何错误。

有些想法?

1 个答案:

答案 0 :(得分:0)

这似乎是一个时间问题,你在这里设置控制器......

DispatchQueue.main.async(execute: {
        // actually running on the main thread async
        self.places.append(PlaceModel(_id: 0, _name: "Park", _lat: 34.1331168, _lng: -118.3550723, _icon: "i01" ) )
        self.places.append(PlaceModel(_id: 1, _name: "Library", _lat: 34.1251168, _lng: -118.3590723, _icon: "i02"))
        let mapVC = self.storyboard!.instantiateViewController(withIdentifier: "MapVC") as! MapViewController
        mapVC.places = self.places
        mapVC.callerLoaded = true
        mapVC.load()
    })

使用地点数组初始化视图控制器很好,但是当您调用mapVC.load()时,您在视图加载之前调用它。您的地图仅在viewDidLoad中正确初始化。所以你试图在地图完全就绪并且视图实际加载之前添加标记。

删除mapVC.load()

并在MapViewController的viewDidLoad()末尾添加self.load(),看看它是如何工作的。