2016-06-15 5 views
0

いいえこれは分かりません。私は前方ジオコーディングのためのいくつかのコードを書いている、私はUITextFieldをあなたが都市の名前を書くと、それが解雇され、同時にUITextFieldが有効な入力が含まれているかどうかを判断するために呼び出されるエンターボタンを押した。エラーがあれば、bool変数に保存され、その値は関数内で変更されます。私はどこにでもprint文を持っていますが、コンソール出力から関数がif条件の後に実行されたことがわかりますが、前に呼び出されています...何ですか?誰かが何が起こっているか私に説明できますか?コード:前に呼び出されていても、コードのブロックの後に関数が実行される

var locationError: Bool? 

func textFieldShouldReturn(textField: UITextField) -> Bool { 
    self.view.endEditing(true) 

    forwardGeocoding(textField.text!) 
    print("forward geocoding ran 1st time") 

    print(locationError) 
    if locationError == true { 
     print("Error") 
    } else if locationError == false { 
     print("Success") 
    } else if locationError == nil { 
     print("No value for locationError") 
    } 

    return false 
} 

func forwardGeocoding(address: String) -> CLLocation? { 
    var userLocation: CLLocation? 
    CLGeocoder().geocodeAddressString(address, completionHandler: { (placemarks, error) in 
     if error != nil { 
      print("Geocoding error: \(error)") 
      self.locationError = true 
      return 
     } 
     if placemarks?.count > 0 { 
      print("Placemark found") 
      self.locationError = false 
      let placemark = placemarks?.first 
      let location = placemark?.location 
      let coordinate = location?.coordinate 
      print("Settings location: \(coordinate!.latitude), \(coordinate!.longitude)") 
      if let unwrappedCoordinate = coordinate { 
       let CLReadyLocation: CLLocation = CLLocation(latitude: unwrappedCoordinate.latitude, longitude: unwrappedCoordinate.longitude) 
       userLocation = CLReadyLocation 
      } 
     } 
    }) 
    return userLocation 
} 

コンソール出力:

forward geocoding ran 1st time 
nil 
No value for locationError 
Placemark found 
Settings location: 48.8567879, 2.3510768 
+0

これは部分的には私の考えですが、その理由は、関数内のコードがクロージャ内にあり、それが残りのコードと非同期に実行されるためです。関数内のuserLocation変数の上にプリントを置いて、何が起こるかを見てください。 –

+0

'placemarks'とは何ですか?それは配列ですか? – Dershowitz123

答えて

0

マルチスレッド、それを試してみてください...あなたは、あなたの関数のパラメータとして完了ハンドラを追加する必要が

let queue = NSOperationQueue() 
    queue.addOperationWithBlock() { 
      NSOperationQueue.mainQueue().addOperationWithBlock() { 
    } 
} 
0

func forwardGeocoding(address: String, completionHandler: (placemarks: String? or [Array of any type], error: NSError?) ->()) -> CLLocation?

ブロック場合は、あなたを変更します。

if error != nil { 
      print("Geocoding error: \(error)") 
      self.locationError = true 
      completionHandler(nil, error) 
      return 
     } 

は、あなたがgeocodeAddressStringを呼び出すと、それは別のスレッド(#AppleDoc This method submits the specified location data to the geocoding server asynchronously and returns)で実行される

forwardGeocoding(textField.text!){(placemarks, error) in 
//your code. 

} 
0

のようにそれを呼び出します。そのため、効率的に2つのスレッドを並行して実行できます。スレッド2のgeocodeAddressStringはサーバコールを実行し、呼び出しが戻るとブロックが実行されるため、実行に時間がかかります。この間、スレッド1は実行を終了し、ログステートメントを出力します。

この問題を処理したい場合、locationError if-else条件ロジックは、コールバックが実行されるとトリガされるように実装する必要があります。

関連する問題