2017-02-14 13 views
1

MapKitのCLGeocoder()。geocodeAddressString()を使用して、アドレスのリストの座標と郡情報を取得します。要求数が50を下回っている限り、すべての機能は素晴らしいですが、50以上のものはAPIの制限を超えています。 CLGeocoderコールは非同期であるため、コールのフローを簡単に調整/制御することはできません(たとえば、一度に1つのアドレスを呼び出すなど)。私は「非同期の世界」でこれを正しく行うにはどうしますか? (免責事項:私はGCDおよび非同期フロー制御の世界に新たなんだので、私は、私はより詳細な対応が必要かもしれないと思う):クラスのプロパティのCLGeocoder geocodeAddressString()制限を打つ

方法にCLGeocoderを呼び出します。ここ

は、関連するコードです物件の住所:

for line in importText { 
     let newAddress = Address() 
     let newHouse = Property() 

     // parse the tab delimited address for each line of input 
     let address = line.components(separatedBy: "\t") 
     if address.count == 4 { 
      newAddress.street = address[0] 
      newAddress.city = address[1] 
      newAddress.state = trimState(state: address[2]) 
      newAddress.zip = address[3] 
      newHouse.address = newAddress 
      newHouse.initializeCoordinates() 
      houses.append(newHouse) 
     } 
    } 
:テキストからの輸入のすべてのプロパティのアドレス(とすると、各プロパティの initializeCoordinatesメソッドへの呼び出しを行うことImportVCでセクションで

func initializeCoordinates() { 

     let addressForCoords = self.address.getAddress() 
     CLGeocoder().geocodeAddressString(addressForCoords, completionHandler: { (placemarks, error) -> Void in 
      if error != nil { 
       print(error!) 
       return 
      } 
      if placemarks!.count > 0 { 
       let placemark = placemarks?[0] 
       let location = placemark?.location 
       self.coordinates = location?.coordinate 

       if let subAdminArea = placemark?.subAdministrativeArea { 
        self.address.county = subAdminArea 
       } 
      } 
     }) 
    } 

、その後、

答えて

0

私は最近同様の問題に直面しました。 for-loopを、最後に自身を呼び出す再帰関数に置き換えます。しかし、そのトリックは0.2秒遅れで自己を呼び出すことです。私は安全な側にするために0.4を使います。これにより、ユーザーの待ち時間が長くなりますが、APIの制限により選択肢はありません。

関連する問題