2016-12-29 10 views
0

У меня есть эта функция, и я настолько близок к тому, чтобы она работала! Я думаю, что у меня проблема с конверсией. Я могу получить координаты в Entity с 3 атрибутами lat (Double), long (Double) и time (Date). Это работает, и я могу распечатать содержимое на экране, и это выглядит хорошо. Но когда я пытаюсь извлечь и использовать в качестве координат на карте, это не сработает. Я думаю, это потому, что они не признаются в качестве истинных координат. Есть идеи?CLLocationManager, Core Data and Arrays

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) 
    { 
     //ARRAY for lat/long data 
     var latArr:[Double] = [] 
     var longArr:[Double] = [] 
     var timeArr:[Date] = [] 

     let location = locations[0] 
     let annotation = MKPointAnnotation() 
     let span:MKCoordinateSpan = MKCoordinateSpanMake(0.01, 0.01) 
     let myLocation = CLLocationCoordinate2D(latitude: location.coordinate.latitude, longitude: location.coordinate.longitude) 
     //annotation.coordinate = myLocation 
     //annotation.title = "\(location.timestamp)" 
     //self.mapView.addAnnotation(annotation) 
     let region:MKCoordinateRegion = MKCoordinateRegionMake(myLocation, span) 
     self.mapView.setRegion(region, animated: true) 
     self.mapView.showsUserLocation = false //SET THIS 
     latitude.text = "latitude: " + "\(location.coordinate.latitude)" 
     longitude.text = "longitude: " + "\(location.coordinate.longitude)" 
     altitude.text = "altitude: " + "\(location.altitude)" 
     speed.text = "speed: " + "\(location.speed)" 
     timestamp.text = "timestamp: " + "\(location.timestamp)" 

     //START -- Core Data 
     let appDelegate = UIApplication.shared.delegate as! AppDelegate 
     let context = appDelegate.persistentContainer.viewContext 

     let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Data") 
     request.returnsObjectsAsFaults = false 

     let data = NSEntityDescription.insertNewObject(forEntityName: "Data", into: context) 
     //let data = NSNumber(double: self.location?.coordinate.latitude) 

     let dlat = Double("\(location.coordinate.latitude)") 
     let dlong = Double("\(location.coordinate.longitude)") 

     data.setValue(dlat, forKey: "lat") 
     data.setValue(dlong, forKey: "long") 
     data.setValue(location.timestamp, forKey: "time") 
     //END -- Core Data 

     do 
     { 
      try context.save() 
      //print("Saved") 
     } 
     catch 
     { 

     } 

     do 
     { 
      var lat: Double = 0 
      var long: Double = 0 
      let t = NSDate() 
      let results = try context.fetch(request) 

      if results.count > 0 
      { 
       for result in results as! [NSManagedObject] 
       { 
        if let datalat = result.value(forKey: "lat") as? Double 
        { 
         //latArr.append(datalat) 
         let lat = datalat 
         print(lat) 
        } 
        if let datalong = result.value(forKey: "long") as? Double 
        { 
         //longArr.append(datalong) 
         let long = datalong 
         print(long) 
        } 
        if let time = result.value(forKey: "time") as? Date 
        { 
         //timeArr.append(time) 
         let t = time 
         print(t) 
        } 
        let mLocation = CLLocationCoordinate2DMake(lat, long) 
        annotation.coordinate = mLocation 
        annotation.title = "\(t)" 
        self.mapView.addAnnotation(annotation) 
       } 
      } 
     } 
     catch 
     { 

     } 
+0

«Это не работает» каким бы то ни было образом? –

+0

Никогда не бывает пустой команды catch {}. По крайней мере, поместите в него заявление журнала. Ошибки могут летать, но вы никогда не узнаете о них сейчас, не так ли? –

+0

Вы уверены, что видите подходящую область карты? Чтобы быть в безопасности, вы можете добавить mapView.showAnnotation (аннотация, анимированный: false) –

ответ

1

Я сравнил свой код в функции, которую я использую в подобном сценарии и включены любые различия (и сделал немного редактирования для краткости, что вы можете взять или оставить). Соответствующий раздел следующим образом:

let request = NSFetchRequest<Data>(entityName: "Data") 
let annotations: [MKAnnotation] = [] 

annotation.title = “\(t)” 

for result in results 
{ 
    if data.lat != nil && data.lon != nil 
    { 
     annotation.coordinate = CLLocationCoordinate2D(latitude: data.lat.doubleValue, longitude: data.lon.doubleValue) 
     annotations.append(annotation) 
    } 
    self.mapView.addAnnotations(annotations) 
    self.mapView.showAnnotations(annotations, animated: false) 
} 

Мой код работает, но Swift 3,0 так что некоторые различия могут быть обусловлены изменениями от более ранних версий, если вы используете 2.2.or 2.3. Я знаю, что мне нужно было вытолкнуть его из NSNumber (из CoreData) в Double, но я думаю, что вы получите ошибку компиляции, если это проблема, - не знаете, почему вы этого не сделали. Как упоминалось в моем комментарии, аннотация шоу поможет, если путевые точки находятся за пределами видимой области карты.

Помимо этого, ваш код выглядит хорошо для меня - сообщите мне, если он все еще действует.

+0

спасибо. Я получаю эту ошибку: Значение типа «NSManagedObject» не имеет члена lat. Есть идеи? И эта ошибка: значение типа «MKMapView» не имеет статуса «showAnnation» участника – SMPLGRP

+0

Я изменил запрос на выборку, чтобы привязать его к вашему объекту Data (не идеальное имя BTW ...) и понял, что showAnnotations должен быть множественным - так Я изменил поток, чтобы использовать массив, так как мой поток все равно. –

+0

все еще повесил трубку. откуда берутся data.lat? также, благодарю вас за вашу помощь. – SMPLGRP