2015-11-06 103 views
0

我已经创建了一组“IssueLocation”'s,这符合MKAnnotation协议的一类。为什么我的注释(从API JSON数据构建而来)没有出现在我的地图视图中?为什么我的标注没有出现在我的地图视图中?

这里是它背后的所有代码:

类代码:

class IssueLocation: NSObject, MKAnnotation { 

    var locationName: String 
    var campusName: String 
    var latitude: Double 
    var longitude: Double 
    var coordinate: CLLocationCoordinate2D 

    init(locationName: String, campusName: String, latitude: Double, longitude: Double, coordinate: CLLocationCoordinate2D) { 
     self.locationName = locationName 
     self.campusName = campusName 
     self.latitude = latitude 
     self.longitude = longitude 
     self.coordinate = coordinate 

     super.init() 

    } 

    var subtitle: String? { 
     if (latitude == 44.22438242146097) { 
      return "West Campus" 
     } else { 
      return "Main Campus" 
     } 
    } 

    var title: String? { 
     return locationName 
    } 

    func mapItem() -> MKMapItem { 

     let addressDictionary = [String(kABPersonAddressStreetKey): locationName] 

     let placemark = MKPlacemark(coordinate: coordinate, addressDictionary: addressDictionary) 

     let mapItem = MKMapItem(placemark: placemark) 
     mapItem.name = locationName 

     return mapItem 
    } 
} 

创建一套IssueLocations的:

func populateMapObjects() { 

     if populatingMapObjects { 
      return 
     } 

     populatingMapObjects = true 

     self.loadingIndicator.startAnimating() 

     var index = 0 


     Alamofire.request(GWNetworking.Router.MapObjects).responseJSON() { response in 
      if let JSON = response.result.value { 

       dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0)) { 

        /* Making an array of all the node IDs from the JSON file */ 

        if (JSON .isKindOfClass(NSArray)) { 


         for _ in JSON as! [Dictionary<String,AnyObject>] { 

          if let issueLocation: IssueLocation = IssueLocation(locationName: "Center of the universe", campusName: "Queen's University", latitude: 44.22661586877309, longitude: -76.49380087852478, coordinate: CLLocationCoordinate2D(latitude: 44.22661586877309, longitude: -76.49380087852478)) { 


           if let locationName = JSON[index]["name"] as? String { 
            issueLocation.locationName = locationName 
           } 

           if let latitude = JSON[index]["coordinates"]!![1] as? Double { 
            issueLocation.latitude = latitude 
           } 

           if let longitude = JSON[index]["coordinates"]!![0] as? Double { 
            issueLocation.longitude = longitude 
           } 

           issueLocation.coordinate = CLLocationCoordinate2D(latitude: issueLocation.latitude, longitude: issueLocation.longitude) 

           index = index+1 

           self.mapObjects.append(issueLocation) 
         } 
        } 
       } 

        dispatch_async(dispatch_get_main_queue()) { 

         self.loadingIndicator.stopAnimating() 
         self.populatingMapObjects = false 
         print(self.mapObjects.count) 
       } 
      } 
     } 
    } 
} 

最后,这是我尝试添加注释到地图视图:

func loadObjectsIntoMapView() { 

    for mapObject in mapObjects { 

     let temporaryMapAnnotation = IssueLocation(locationName: mapObject.locationName, campusName: "Main Campus", latitude: mapObject.latitude, longitude: mapObject.longitude, coordinate: mapObject.coordinate) 

     if (temporaryMapAnnotation.longitude < -76.50921821594238) { 
      temporaryMapAnnotation.campusName = "West Campus" 
     } 

     self.mapView.addAnnotation(temporaryMapAnnotation) 
    } 

} 
+0

你打电话loadObjectsIntoMapView()?当你派遣到主队列时,你会想在你得到JSON之后这样做吗? – beyowulf

+0

我在viewDidLoad中 –

+0

嘿调用populateMapObjects后立即调用它!有效!操作可能发生在错误的顺序!注释现在出现在地图上。 –

回答

1

移动loadObjectsIntoMapView()到该块:

dispatch_async(dispatch_get_main_queue()) { 

         self.loadingIndicator.stopAnimating() 
         self.populatingMapObjects = false 
         print(self.mapObjects.count) 
       } 

在调用viewDidLoad中loadObjectsIntoMapView()将立即执行,且数据还没有从服务器下来,因此还必须在MapObjects的无MapObject的,因此没有注释。

+0

非常感谢。它现在有效 –

相关问题