【问题标题】:Create an array of CLLocation coordinates from Core Data从 Core Data 创建一个 CLLocation 坐标数组
【发布时间】:2015-05-28 18:17:06
【问题描述】:

也许我找不到这个问题的答案,因为它非常简单,我应该能够弄清楚,但我很难过。哦,如果我的某些术语有问题,我深表歉意 - 我还在学习。

我正在使用 Swift 并且有一个从 Core Data 派生的数组。到目前为止,一切都很好。该数组中的两个元素是存储纬度和经度的 Doubles/NSNumbers。我将使用这两个元素在地图上绘制,但我不知道如何将这两个元素放入它们自己的 CLLocations 数组中。

所以,我已经在 Core Data 中获得了所有数据的数组:

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]

但它包含来自 Core Data 中所有内容的数据(按游戏过滤):

class Locations: NSManagedObject {

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

}

我只需要一个包含纬度和经度的数组,我需要将其转换为 CLLocation 以放在地图上。我应该弄清楚地图部分——只是这个数组让我摸不着头脑!谢谢。

【问题讨论】:

  • 不清楚为什么“需要转换为 CLLocation 才能放在地图上”。如果地图是 MKMapView,它需要实现 MKAnnotation 协议的对象。从技术上讲,CLLocation 不符合 MKAnnotation,但它恰好有一个坐标属性,该属性适用于地图视图。
  • 谢谢安娜。所以我不一定需要对数据进行任何转换?我想这会让事情变得更容易,尽管我仍然不确定如何获取我在 Core Data 中的坐标并将它们放入 MapView。据我了解,我需要一组坐标信息,而我当前从 Core Data 转储的数据还包含游戏和时间信息。正如我所说,我确信对此有一个非常简单的答案,但我就是无法理解它。
  • 使用一个正式实现 MKAnnotation 的类来代替 CLLocation,就像内置的 MKPointAnnotation 一样。更好的是(我认为)让您的 Locations 类实现 MKAnnotation 协议本身,这样就不需要新的数组(然后您可以给地图视图添加一个 Locations 对象)。声明 Locations 实现了 MKAnnotation(以及 NSManagedObject),然后为 coordinate 实现一个 getter 方法。
  • stackoverflow.com/questions/26995094/…。不确定您是否真的需要作为扩展来实现,但它给出了这个想法。免责声明:我没有尝试过。
  • 我试试看!谢谢,安娜。

标签: arrays swift core-data cllocation


【解决方案1】:

想通了。除了用于遍历 Core Data 数组的 for 循环之外,我还必须将纬度和经度转换为 Double,然后将它们作为 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)
    }

【讨论】:

    【解决方案2】:

    很好的解决方案亚当......我能够做类似的事情......

    声明这些全局变量

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

    制作一个扩展以轻松访问 CLLoationDegrees 类型作为 Double

    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)
    }
    

    【讨论】:

      【解决方案3】:

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

      为每个 CLLocation 设置一个实体,无论实体使用位置点,这都会是一个太多的关系。我们称之为 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
      

      【讨论】:

        猜你喜欢
        • 2016-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-17
        • 2012-02-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多