允许快速在CoreData中存储MKPolyline所需的代码是什么。
因此,例如,如果我有一个我要保存MKPolyline的核心数据实体(例如“ myEntity”),并已将“ polyline”字段添加为可转换,并在xcode中将其设置为“ transformable”。还产生了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?
}
问题-要使此功能有效,需要什么代码?
(我确实注意到这篇文章是关于objective-c的,但是我一直在努力理解/移植/使它起作用-您如何在核心数据中存储来自NSMutable数组的数据?)
归档折线对象并保存到核心数据:
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归档和取消归档功能。以及一些辅助功能。
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)
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句