从核心数据中检索 Swift 中的坐标时遇到问题

Posted

技术标签:

【中文标题】从核心数据中检索 Swift 中的坐标时遇到问题【英文标题】:Trouble retrieving coordinates in Swift from Core Data 【发布时间】:2017-06-23 20:04:11 【问题描述】:

我是编程新手,因此对我的任何无知表示歉意。我也确信有很多我没有遵循的最佳实践,但我的问题更具体。我正在为特定人群制作联系人应用程序。该应用程序的一部分是地图视图,显示每个联系人的引脚。当我保存一个新人时,我正在对地址进行地理编码,如下所示:

    let entity = NSEntityDescription.entity(forEntityName: "Person", in: self.managedObjectContext)
    let record = NSManagedObject(entity: entity!, insertInto: self.managedObjectContext)

geocoder.geocodeAddressString(rvAddress, completionHandler: (placemarks, error) -> Void in
        if((error) != nil)
            print("Error", error!)
        
        if let placemark = placemarks?.first 
        let rvCoordinates = placemark.location!.coordinate
        let rvLatitude = rvCoordinates.latitude
        let rvLongitude = rvCoordinates.longitude
        record.setValue(rvLatitude, forKey: "latitude")
        record.setValue(rvLongitude, forKey: "longitude")    
            
    )

在从初始表视图到地图视图控制器viewController.fetchedPeople = fetchedResultsController.fetchedObjectsvar fetchedPeople: [Person]? 的地图视图控制器类中,填充了获取的人员的位置。我在地图视图控制器中有一个这样的 for 循环:

for people in  fetchedPeople! 
            let firstName = people.value(forKey: "firstName") as? String
            let lastName = people.value(forKey: "lastName") as? String
            let street = people.value(forKey: "street") as? String
            let rvLatitude = people.value(forKey: "latitude") as? Double
            let rvLongitude = people.value(forKey: "longitude") as? Double
            print("LAT: \(rvLatitude!) LONG: \(rvLongitude!)")
            let rvCoordinates = CLLocationCoordinate2D(latitude: rvLatitude!, longitude: rvLongitude!)

            var personName: String!
            var personAddress: String!
            if firstName != nil 
                personName = firstName! + " " + lastName!
             else 
                personName = lastName!
            
            print(personName)

            personAddress = street!

            let mapPerson = MapPerson(title: personName, locationName: personAddress, coordinate: rvCoordinates)
           //mapPeopleArray.append(mapPerson)
           mapView.addAnnotation(mapPerson)
            print(rvCoordinates)

当我最初添加联系人时,一切都很好。引脚按预期下降。控制台显示:

LAT: 41.1656913 LONG: -81.8692497
Eric Madzay
CLLocationCoordinate2D(latitude: 41.165691299999999, longitude: -81.869249699999997)
LAT: 41.253647 LONG: -81.875974
Ethan Madzay
CLLocationCoordinate2D(latitude: 41.253647000000001, longitude: -81.875973999999999)
LAT: 41.203748 LONG: -81.858518
Work
CLLocationCoordinate2D(latitude: 41.203747999999997, longitude: -81.858518000000004)'

但是,当我关闭应用程序、重新运行并打开地图视图时,只有一些图钉掉落。我对任何事情都进行零更改。只需关闭/打开并导航即可查看。控制台读取:

LAT: 41.253647 LONG: -81.875974
Ethan Madzay
CLLocationCoordinate2D(latitude: 41.253647000000001, longitude: -81.875973999999999)
LAT: 41.1656913 LONG: -81.8692497
Eric Madzay
CLLocationCoordinate2D(latitude: 41.165691299999999, longitude: -81.869249699999997)
LAT: 0.0 LONG: 0.0
Work
CLLocationCoordinate2D(latitude: 0.0, longitude: 0.0)

这只是一个例子,但似乎最好地展示了我的问题。我知道我一定是遗漏了一些东西或不了解某些东西是如何运作的,我只是一辈子都无法弄清楚。感谢您的宝贵时间。

【问题讨论】:

能否提供更多细节?例如geocoder.geocodeAddressString 函数中的record 是什么?数组people 是如何填充的?如果没有这些细节,恐怕这个问题是无法解决的:) 已编辑以显示这些详细信息。如果还需要更多信息,请告诉我,再次为头痛道歉,我是新手。 您在何时何地保存上下文?看起来保存是在添加新人之后发生的,但在地理编码器的完成处理程序设置相应的纬度/经度值之前。 【参考方案1】:

谢谢 pbasdf,这是我不明白的,完成处理程序是如何工作的。将上下文也保存在地理编码块中解决了我的问题。谢谢!

【讨论】:

以上是关于从核心数据中检索 Swift 中的坐标时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

从核心数据 Swift 4 中检索数组(可转换)

Swift 3.0 - 核心数据 / 意外发现 nil

核心数据关系,如何从关系中插入和检索数据

在swift ios中再次运行应用程序后核心数据显示故障记录?

Swift 中的 iOS 私有/公共数据管理和存储

如何使用 Swift 中的 url 从 firebase 正确检索数据?