尝试使用尚未从自身检索的数据后调用委托方法 didUpdateLocations - Xcode Swift

Posted

技术标签:

【中文标题】尝试使用尚未从自身检索的数据后调用委托方法 didUpdateLocations - Xcode Swift【英文标题】:Delegate method didUpdateLocations is called after trying to use data that has not yet been retrieved from itself - Xcode Swift 【发布时间】:2019-03-02 06:17:07 【问题描述】:

我有一个 NS 对象(称为 GoogleSearch),用于获取用户的位置数据。这些是创建的一些全局变量和 init 函数:

let locationManager = CLLocationManager()
var coordinates: CLLocationCoordinate2D?

override init() 
    super.init()
    print("1")
    DispatchQueue.main.async 
        self.locationManager.delegate = self
        self.locationManager.desiredAccuracy = kCLLocationAccuracyKilometer
        if CLLocationManager.locationServicesEnabled() 
            self.locationManager.startUpdatingLocation()
        
    


接下来,这是我的委托方法:

extension GoogleSearch: CLLocationManagerDelegate 
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) 
    print("2")
    let userLocation: CLLocation = locations[0] as CLLocation
    self.coordinates = CLLocationCoordinate2D(latitude: userLocation.coordinate.latitude, longitude: userLocation.coordinate.longitude)


接下来,我尝试在稍后的函数中访问坐标(在委托方法中设置):

func searchForPlaces(completion: @escaping ([place])->()) 
    print(coordinates)

最后,在我实现这个NSobjectViewController中,我在viewDidLoad中有如下代码:

self.googleSearch = GoogleSearch()
    DispatchQueue.main.async 
        self.googleSearch.searchForPlaces(completion:  (places) in
            DispatchQueue.main.async 
                self.places = places
                self.placesCollectionView.reloadData()
            
        )
    

问题是在 searchForPlaces 函数中打印坐标会打印 nil,因为它是在调用委托方法之前运行的。我应该在我的 NSObject 或我的 ViewController 中更改什么以确保我可以从 searchForPlaces() 访问坐标?

谢谢。

【问题讨论】:

【参考方案1】:

你可以这样实现:

class GoogleSearch:NSObject 

  let locationManager = CLLocationManager()
  var coordinates: CLLocationCoordinate2D?
  var completionHandler: ((CLLocationCoordinate2D) -> Void)?

  override init() 
      super.init()
      print("1")

    

   func searchForPlaces(completion: @escaping (CLLocationCoordinate2D) -> Void) 
     self.completionHandler = completion
     self.locationManager.delegate = self
     self.locationManager.desiredAccuracy = kCLLocationAccuracyKilometer
     if CLLocationManager.locationServicesEnabled() 
        self.locationManager.stopUpdatingLocation()
        self.locationManager.startUpdatingLocation()
     
   



extension GoogleSearch: CLLocationManagerDelegate 
   func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) 
     print("2")
     let userLocation: CLLocation = locations[0] as CLLocation
     self.coordinates = CLLocationCoordinate2D(latitude: userLocation.coordinate.latitude, longitude: userLocation.coordinate.longitude)
     self.completionHandler?(self.coordinates!)
    

【讨论】:

感谢您的快速回复。不幸的是,它对我不起作用。我相信您可能需要在某个地方添加完成处理程序? @Shubham 您的searchForPlaces 声明在哪里? 糟糕。我在上面添加了错误的,请参阅我编辑的答案。它在 viewDidLoad 函数中的 VC 中调用。 @舒巴姆 不幸的是,这也不起作用。我需要 searchForPlaces 有一个 Place 类型的完成处理程序,如上所示。而且,我需要在 searchForPlaces 中访问坐标。我能从这里做什么?感谢您的所有帮助。 @Shubham 如果您需要Place 类型的完成处理程序,那有什么问题,只需更改类型即可。

以上是关于尝试使用尚未从自身检索的数据后调用委托方法 didUpdateLocations - Xcode Swift的主要内容,如果未能解决你的问题,请参考以下文章

调用委托方法后执行选择器

从 iOS cordova 中的委托方法发送 pluginResult

从应用委托中检索 managedObjectContext 时崩溃

如何通过表达式树生成的委托调用自己?

watchOS - 如何从扩展委托更新 SwiftUI 视图

NSFetchedResultsController 委托异常