首页 文章

根据核心数据创建 CLLocation 坐标数组

提问于
浏览
1

也许我找不到这个问题的答案,因为它很简单,我应该可以弄清楚,但是我很沮丧。哦,抱歉,如果我的某些术语不正确-我仍在学习。

我正在使用 Swift,并且有一个从 Core Data 派生的数组。到现在为止还挺好。此数组中的两个元素是 Doubles/NSNumbers 存储纬度和经度。我将使用这两个元素绘制地图,但无法弄清楚如何将这两个元素放入自己的 CLLocations 数组中。

因此,我在核心数据中得到了所有数据的数组:

var locationsList: [Locations] = []

 var context = (UIApplication.sharedApplication().delegate as AppDelegate).managedObjectContext!
    var request = NSFetchRequest(entityName: "Locations")
    let pred = NSPredicate(format: "game = %d", passedGameNumber)
    request.predicate = pred
    request.sortDescriptors = [NSSortDescriptor(key:"time", ascending: false)]
    self.locationsList = context.executeFetchRequest(requestMap, error: nil)! as [Locations]

但是它保留了核心数据中的所有数据(按游戏过滤):

class Locations: NSManagedObject {

@NSManaged var game: NSNumber
@NSManaged var time: NSDate
@NSManaged var latitude: NSNumber
@NSManaged var longitude: NSNumber

}

而且我只需要一个包含纬度和经度的数组,我将需要将其转换为 CLLocation 以放置在地图上。我应该弄清楚地图部分-正是这个数组让我挠头!谢谢。

3 回答

  • 3

    弄清楚了。在用于循环访问 Core Data 数组的 for 循环之上,我还必须将纬度和经度转换为 Doubles,然后再将其作为 CLLocationCoordinate2D 附加到新数组中。

    var coordinates: [CLLocationCoordinate2D] = []
    
    for index in 0..<self.locationsList.count{
            var lat = Double(self.locationsList[index].latitude)
            var long = Double(self.locationsList[index].longitude)
            var coordinatesToAppend = CLLocationCoordinate2D(latitude: lat, longitude: long)
            coordinates.append(coordinatesToAppend)
        }
    
  • 1

    好的解决方案 Adam...I 可以执行类似的操作。

    声明这些全局变量

    var longitudeCollection: [String] = [String]()
     var latitudeCollection: [String] = [String]()
    

    进行扩展以轻松访问作为 Double 的 CLLoationDegrees 类型

    extension String {
    var coordinateValue: CLLocationDegrees {
        return (self as NSString).doubleValue
        }
    }
    

    这就是您要附加坐标的方式

    for var index = 0; index<=longitudeCollection.count-1; index++ {
      var lat = latitudeCollection[index].coordinateValue
      var long = longitudeCollection[index].coordinateValue
    
      var coordinatesToAppend = CLLocationCoordinate2D(latitude: lat, longitude: long)
      coordinates.append(coordinatesToAppend)
    }
    
  • 0

    您不需要使用 NSNumber 来存储纬度和经度点。您可以将 CLLocation 直接存储到核心数据中。

    为每个 CLLocation 设置一个实体,无论使用位置点的实体是哪种 too-many 关系。我们将此称为 LocationPoint:

    class LocationPoint: NSManagedObject {
    
    @NSManaged var game: NSNumber
    @NSManaged var time: NSDate
    @NSManaged var location: AnyObject
    
    }
    

    然后,在 Xcode 数据模型中将 location 属性设置为可转换。而已!

    在 Objective-c 中,您实际上仍然可以将此 LocationPoint 属性声明为 CLLocation,而不会出现任何错误:

    @property (nonatomic, strong) CLLocation *location
    

相关问题