2016-04-21 23 views
7

Welcher Code wäre erforderlich, um das Speichern eines MKPolyline in CoreData in swift zu ermöglichen.Wie kann ein MKPolyline-Attribut in IOS-Coredata mit swift transformierbar gespeichert werden?

Also zum Beispiel, wenn ich eine meiner Kerndateneinheiten hatte (sagen wir "myEntity"), für die ich eine MKPolyline speichern wollte und das Feld "Polylinie" als transformierbar hinzugefügt und auf "transformierbar" gesetzt habe in xcode. Haben auch die NSManagedObject-Unterklasse erstellt.

myEntity.swift

import UIKit 
import CoreData 
import MapKit 
class myEntity: NSManagedObject { 
} 

myEntity + CoreDataProperties.swift

import Foundation 
import CoreData 
extension myEntity { 
    @NSManaged var title: String 
    @NSManaged var polyline: NSObject? 
} 

Frage - Welcher Code ist erforderlich, um dies zu ermöglichen, zu arbeiten?

(I beachten Sie diesen Beitrag Re Objective-C, jedoch zu verstehen, ich bin zu kämpfen/Hafen/get dies funktioniert - How do you store data from NSMutable Array in Core Data?)

Antwort

6

Archive Polylinienobjekt und speichern zu Core Data:

let context = self.fetchedResultsController.managedObjectContext 
    let entity = self.fetchedResultsController.fetchRequest.entity! 
    let newManagedObject = NSEntityDescription.insertNewObjectForEntityForName(entity.name!, inManagedObjectContext: context) 
    let polylineObj = polyline() // For test purpose. 
    let polylineData = polylineToArchive(polylineObj) 
      newManagedObject.setValue(polylineData, forKey: "polyline") 
     context.save() 

Unarchive Linienzug vom NSManagedObject:

let object = self.fetchedResultsController.objectAtIndexPath(indexPath) as! NSManagedObject 
    let data = object.valueForKey("polyline") as! NSData 
    let polyline = polylineUnarchive(data) 
    log(polyline!) 

MKPolyline arhiver und unarchiver Funktionen. Sowie einige Hilfsfunktionen.

func polylineUnarchive(polylineArchive: NSData) -> MKPolyline? { 
    guard let data = NSKeyedUnarchiver.unarchiveObjectWithData(polylineArchive), 
     let polyline = data as? [Dictionary<String, AnyObject>] else { 
     return nil 
    } 
    var locations: [CLLocation] = [] 
    for item in polyline { 
     if let latitude = item["latitude"]?.doubleValue, 
      let longitude = item["longitude"]?.doubleValue { 
      let location = CLLocation(latitude: latitude, longitude: longitude) 
      locations.append(location) 
     } 
    } 
    var coordinates = locations.map({(location: CLLocation) -> CLLocationCoordinate2D in return location.coordinate}) 
    let result = MKPolyline(coordinates: &coordinates, count: locations.count) 
    return result 
} 

func polylineToArchive(polyline: MKPolyline) -> NSData { 
    let coordsPointer = UnsafeMutablePointer<CLLocationCoordinate2D>.alloc(polyline.pointCount) 
    polyline.getCoordinates(coordsPointer, range: NSMakeRange(0, polyline.pointCount)) 
    var coords: [Dictionary<String, AnyObject>] = [] 
    for i in 0..<polyline.pointCount { 
     let latitude = NSNumber(double: coordsPointer[i].latitude) 
     let longitude = NSNumber(double: coordsPointer[i].longitude) 
     let coord = ["latitude" : latitude, "longitude" : longitude] 
     coords.append(coord) 
    } 
    let polylineData = NSKeyedArchiver.archivedDataWithRootObject(coords) 
    return polylineData 
} 

func polyline() -> MKPolyline { 
    let locations = [CLLocation(latitude: 37.582691, longitude: 127.011186), CLLocation(latitude: 37.586112,longitude: 127.011047), CLLocation(latitude: 37.588212, longitude: 127.010438)] 
    var coordinates = locations.map({(location: CLLocation) -> CLLocationCoordinate2D in return location.coordinate}) 
    let polyline = MKPolyline(coordinates: &coordinates, count: locations.count) 
    return polyline 
} 

func log(polyline: MKPolyline) { 
    let coordsPointer = UnsafeMutablePointer<CLLocationCoordinate2D>.alloc(polyline.pointCount) 
    polyline.getCoordinates(coordsPointer, range: NSMakeRange(0, polyline.pointCount)) 
    var coords: [Dictionary<String, AnyObject>] = [] 
    for i in 0..<polyline.pointCount { 
     let latitude = NSNumber(double: coordsPointer[i].latitude) 
     let longitude = NSNumber(double: coordsPointer[i].longitude) 
     let coord = ["latitude" : latitude, "longitude" : longitude] 
     coords.append(coord) 
    } 
    print(coords) 
} 
+0

Wow. Vielen Dank. Lass mich so schnell wie möglich testen und dann akzeptieren. Übrigens, sollte der Ansatz zwischen IOS Updates verkauft werden? – Greg

+0

@Greg Ja. Diese Funktionalität ist zwischen iOS-Updates stabil. In meinem Beispiel werden nur die Koordinaten des Archivs und des Archivs gespeichert. Wenn Sie mehr Material aus dem MKPolyline archivieren möchten, müssen Sie zusätzlichen Code hinzufügen. – Ramis

+0

ok danke - ich denke das ist alles was ich brauche – Greg