2016-03-31 16 views
1

私のappDelegateには、ユーザーの現在の位置を返す関数があります。dispatch_asyncと予期せぬ空白の戻り値Swiftのvoid関数return

今、私はいくつかの他の場所で非同期にそれを呼び出すようにしたいと私はやった:

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()は私にエラーをもたらす:

unexpected non-void return value in void function

私はあまり知りませんSwiftのスレッドについては、まだこの問題を解決する手助けはできますか?

答えて

3

問題が

dispatch_async(dispatch_get_global_queue(priority, 0)) { 

dispatch_async(dispatch_get_main_queue()) { 

実際に閉鎖/関数を作成しているので、その中の任意のコードがその機能に関連しますが、ない

func handleLocation() -> CLLocation { 

あなたの場合です関数内で非同期操作を実行している場合、asynchronoの後にreturn文を使用することはできません私たちの操作は完了です。代わりに、関数内で補完ハンドラを使用する必要があります。例えば:

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 
    } 
} 
+0

うーんので、私はただの内側に私の関数の本体を置くことができますaSyncFunction?どうすればいいのか正確に教えてください。ここにコンセプトがあるのか​​どうかは分かりません。ありがとう! – randomuser1

+0

ユースケースの例を追加しました。質問がある場合はお知らせください。 – PeejWeej

+0

ありがとうございました!私はちょうどそれを私のxcodeに貼り付けました。この行の近くでエラーが発生します: 'handleLocation {(location:CLLocation?)in'は宣言を期待しています。この場合の典型的なエラーですか? – randomuser1

関連する問題