在Swift

时间:2016-03-31 16:06:10

标签: ios swift dispatch-async

我的appDelegate中有一个功能可以返回用户的当前位置。

现在我想在其他地方异步调用它,我做了:

func handleLocation() -> CLLocation {
  let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT
  dispatch_async(dispatch_get_global_queue(priority, 0)) {
    let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
    appDelegate.startGPS()
    while (!appDelegate.isLocationFixed()) {
      sleep(1)
    }
    dispatch_async(dispatch_get_main_queue()) {
      return appDelegate.getLocation()
    }
  }
}

但现在这一行return appDelegate.getLocation()给我带来了错误:

  

void函数中的意外非void返回值

我对Swift中的帖子了解不多,但是,你能帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:4)

问题是

dispatch_async(dispatch_get_global_queue(priority, 0)) {

dispatch_async(dispatch_get_main_queue()) {

实际上是创建闭包/函数,因此其中的任何代码都与该函数相关,而不是

func handleLocation() -> CLLocation {

如果在函数内进行异步操作,则异步操作完成后,实际上不能有return语句。相反,您应该在函数中使用完成处理程序。 e.g:

func aSyncFunction(completionHandler: (AnyObject) -> ()) {

    //do async opporation

    completionHandler("finished") // call the completion block when finished
}

以下是我将如何为您的用例实现它:

func handleLocation(completionBlock: (CLLocation?) -> ()) {

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {

        guard let appDelegate = UIApplication.sharedApplication().delegate as? AppDelegate else {
            dispatch_async(dispatch_get_main_queue()) {
                completionBlock(nil)
            }
            return
        }
        appDelegate.startGPS()
        while (!appDelegate.isLocationFixed()) {
            sleep(1)
        }
        dispatch_async(dispatch_get_main_queue()) {
            completionBlock(appDelegate.getLocation())
        }
    }
}

示例用法:

handleLocation { (location: CLLocation?) in
    if let location = location {
         //use valid location
    }
}