允许在swift中在CoreData中存储MKPolyline所需的代码是什么?
例如,如果我有一个我想要保存MKPolyline的核心数据实体(比如“myEntity”),并将“折线”字段添加为可转换的,并将其设置为“可转换”的Xcode中。还生成了NSManagedObject子类。
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?
}
问题 - 允许此功能需要哪些代码?
(我确实注意到这篇文章的目标-c,但是我很难理解/移植/使其工作 - How do you store data from NSMutable Array in Core Data?)
答案 0 :(得分:8)
归档折线对象并保存到核心数据:
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()
从 NSManagedObject :
取消归档折线 let object = self.fetchedResultsController.objectAtIndexPath(indexPath) as! NSManagedObject
let data = object.valueForKey("polyline") as! NSData
let polyline = polylineUnarchive(data)
log(polyline!)
MKPolyline arhiver和unarchiver函数。还有一些辅助函数。
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)
}