Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在调用另一个方法之前等待调用didUpdateLocation方法?_Ios_Swift_Asynchronous_Cllocationmanager - Fatal编程技术网

Ios 如何在调用另一个方法之前等待调用didUpdateLocation方法?

Ios 如何在调用另一个方法之前等待调用didUpdateLocation方法?,ios,swift,asynchronous,cllocationmanager,Ios,Swift,Asynchronous,Cllocationmanager,我正在开发一个应用程序,希望在用户注册时存储用户的当前位置 因此,只要用户单击注册按钮,就会调用locationManager.startUpdatingLocation(),然后执行注册操作 但是,即使在didUpdateLocations委托方法返回坐标之前,注册方法也会被触发,因此用户的位置在数据库中存储为nil 尝试在didUpdateLocations中调用signup方法是一个混乱的过程,因为该委托被调用了多次 func signup() { self.ge

我正在开发一个应用程序,希望在用户注册时存储用户的当前位置

因此,只要用户单击注册按钮,就会调用locationManager.startUpdatingLocation(),然后执行注册操作

但是,即使在didUpdateLocations委托方法返回坐标之前,注册方法也会被触发,因此用户的位置在数据库中存储为nil

尝试在didUpdateLocations中调用signup方法是一个混乱的过程,因为该委托被调用了多次

    func signup() { 
        self.getLocation()
        let point = PFGeoPoint(latitude:locationLat, longitude:locationLon)
        ...
        newUser[PF_USER_LOCATION] = point
        newUser.signUpInBackground(block: { (succeed, error) -> Void in

            if let errorInSignup = error {
                ...    
            } else {
                ...
            }
        })
    }

    func getLocation() {
        if CLLocationManager.locationServicesEnabled() {            
            locationManager.delegate = self
            locationManager.desiredAccuracy = kCLLocationAccuracyBest
            locationManager.startUpdatingLocation()
        }
    }

    func locationManager(_ manager: CLLocationManager, didUpdateLocations  locations: [CLLocation]) {

        let locValue:CLLocationCoordinate2D = manager.location!.coordinate

        locationLat = locValue.latitude
        locationLon = locValue.latitude
    }
我只添加了部分代码

等待收到坐标调用注册功能的正确程序是什么


requestwhenUseAuthorization()
viewDidLoad()中

func signup() { 
        self.getLocation()

    }
在这里打电话

   func locationManager(_ manager: CLLocationManager, didUpdateLocations  locations: [CLLocation]) {
          manager.stoptUpdatingLocation() // initialy stop updation
        let locValue:CLLocationCoordinate2D = manager.location!.coordinate

        locationLat = locValue.latitude
        locationLon = locValue.latitude
         let point = PFGeoPoint(latitude:locationLat, longitude:locationLon)
        ...
        newUser[PF_USER_LOCATION] = point
        newUser.signUpInBackground(block: { (succeed, error) -> Void in

            if let errorInSignup = error {
                ...    
            } else {
                ...
                // call your main view
            }
        })
    }

喜欢什么

func signup() { 
        self.getLocation()

    }
在这里打电话

   func locationManager(_ manager: CLLocationManager, didUpdateLocations  locations: [CLLocation]) {
          manager.stoptUpdatingLocation() // initialy stop updation
        let locValue:CLLocationCoordinate2D = manager.location!.coordinate

        locationLat = locValue.latitude
        locationLon = locValue.latitude
         let point = PFGeoPoint(latitude:locationLat, longitude:locationLon)
        ...
        newUser[PF_USER_LOCATION] = point
        newUser.signUpInBackground(block: { (succeed, error) -> Void in

            if let errorInSignup = error {
                ...    
            } else {
                ...
                // call your main view
            }
        })
    }

仅当您收到当前位置时,才更改call方法和call Sign-Up方法。如果您愿意只针对ios9及更高版本,则可以使用闭包,您可以使用
requestLocation
,否则您需要在
didUpdateLocations
中编写代码以检查适当的水平精度,然后停止位置更新并完成注册。当用户拒绝位置权限或无法在合理时间内确定位置时,您还需要提供相应的代码@Paulw11所记笔记感谢您指出更改呼叫方法仅当您收到当前位置时才更改呼叫注册方法,您可以使用闭包,如果您愿意只针对ios9和更高版本,您可以使用
requestLocation
,否则您需要在
didUpdateLocations
中编写代码,以检查适当的水平精度,然后停止位置更新并完成注册。当用户拒绝位置权限或无法在合理时间内确定位置时,您还需要提供适当的代码@Paulw11感谢您指出感谢@Anbu.karthik另外,我使用了locationmanager.startUpdatingLocations()。这已经多次调用委托方法。在中,应该将其替换为locationManager.requestLocation(),以便只调用一次。@Sowndharya-也可以在onceThanks@Anbu.karthik上跟随paul注释。此外,我使用了locationManager.startUpdatingLocations()。这已经多次调用委托方法。在中,应该将其替换为locationManager.requestLocation(),以便只调用一次。@Sowndharya-也跟随paul注释一次