2017-12-11 2 views
0

Ich habe versucht, für eine bestimmte Zeit Wegbeschreibungen zu Anmerkungen auf meiner gesamten Karte zu erhalten. Ich habe kürzlich herausgefunden, wie man das macht, aber jetzt werden nicht alle meine Anmerkungen auf der Karte erscheinen, nur einer tut es. Ich verwende eine öffentliche Datenbank in Cloudkit, um alle meine Benutzerinformationen zu speichern. Seit ich die Variable annotation = MKPointAnnotation() für den gesamten View-Controller verfügbar gemacht habe, wurden nicht alle meine Annotationen auf der Karte angezeigt.Anmerkungen werden nicht auf Karte geladen

Dies ist, wie ich get directions:

let annotation = MKPointAnnotation() 

@IBAction func getDirections(_ sender: Any) { 
    let view = annotation.coordinate   
    print("Annotation: \(String(describing: view))") 
    let currentLocMapItem = MKMapItem.forCurrentLocation() 
    let selectedPlacemark = MKPlacemark(coordinate: view, addressDictionary: nil) 
    let selectedMapItem = MKMapItem(placemark: selectedPlacemark) 
    let mapItems = [selectedMapItem, currentLocMapItem] 
    let launchOptions = [MKLaunchOptionsDirectionsModeKey: MKLaunchOptionsDirectionsModeDriving] 
    MKMapItem.openMaps(with: mapItems, launchOptions:launchOptions) 
} 

Dies ist, wie ich meine Anmerkungen zeigen:

func fetch() { 
    let truePredicate = NSPredicate(value: true) 
    let eventQuery = CKQuery(recordType: "User", predicate: truePredicate) 
    let queryOperation = CKQueryOperation(query: eventQuery) 
    queryOperation.recordFetchedBlock = { (record : CKRecord!) in 

     self.truck.append(record) 

     self.annotation.title = record?["username"] as? String 
     self.annotation.subtitle = record?["hours"] as? String 
     if let location = record?["location"] as? CLLocation { 
      self.annotation.coordinate = location.coordinate 
     } 

     print("recordFetchedBlock: \(record)") 

     self.mapView.addAnnotation(self.annotation) 
    } 

    queryOperation.queryCompletionBlock = { (cursor, error) in 

     print("queryCompletionBlock: \(self.truck)") 
    } 

    database.add(queryOperation) 
} 

ich diesen Fehler jetzt bin immer:

This application is modifying the autolayout engine from a background thread after the engine was accessed from the main thread. This can lead to engine corruption and weird crashes. 
+3

Der Fehler zeigt, dass Sie Änderungen an der Benutzeroberfläche im Hintergrundthread vornehmen, weshalb Sie mit diesem Fehlerprotokoll konfrontiert werden. Aktualisieren Sie Ihren Code und schreiben Sie alle Änderungen der Benutzeroberfläche im Hauptthread. – Surjeet

Antwort

2

Als @ Surjeet sagte, alle UI-Änderungen im Hauptthread schreiben.

DispatchQueue.main.async { 
    self.mapView.addAnnotation(self.annotation) 
} 
+0

Danke! Ich habe über den Hauptfaden gestresst, ich habe die dispatchQueue an die falschen Stellen gesetzt. Ich bin immer noch verwirrt darüber, wie die Karte nur eine Annotation zeigt, wenn ich "let annotation = mkpointannotation()" für den gesamten Controller verfügbar mache. – kcamp

Verwandte Themen