2016-04-14 11 views
1

緯度/経度を取得するには、多くのアドレスをCLPlacemarkに変換する必要があるアプリがあります。 アップルのドキュメントでは、多くのジオコードリクエストを実行すべきではないと説明されています。ジオコーディングリクエストはレート制限があります。多くのジオコード要求を実行する戦略

私のアプリケーションでは、ジオコーディングを実行するためにただ1つのアドレスを要求します。答えを受け取ったら、私はすべてのアドレスの緯度/経度を受け取るまで次のものを要求します。

このコードを専用スレッドに入れて、ユーザーをブロックしません。それは動作するようですが、それは良い戦略ですか? Appleが私のアプリケーションをブラックリストに載せたり、私の要求に対してエラーを返さないようにするにはどうすればいいですか?

geoCodingFor(myAddress, index: 0) 

private func geoCodingFor(contacts:[String], index:Int) { 
    if index < contacts.count { 
     let address = contacts[index] 
     CLGeocoder().geocodeAddressString(address) { placemarks, error in 
      if let theError = error { 
       print("\(#function) geocode has failed for address \(address) with error \(theError .localizedDescription)") 
      } else { 
       if let thePlacemark = placemarks { 
        if thePlacemark.count > 0 { 
         print("=> Found placemark for address \(address)") 
        } else { 
         print("No placemark for address \(address)") 
        } 
       } else { 
        print("\(#function) Warning geocode has no results for address \(address)") 
       } 
      } 
      if index < contacts.count { 
       self.geoCodingFor(contacts, index: index + 1) 
      } 
     } 
    } else { 
     print("\(#function) ================> Geocoding is completed") 
    } 
} 

答えて

0

ショート:たぶんちょうど各ジオコーディング要求の前にsleep(2)を試してみてください。

ロング:アップルが自分のアプリを「ブラックリストに登録する」かどうかはわかりませんが。ジオコーディングのためのアプリが「ブラックリスト登録」されているかどうかは不明です。

私自身もあなたと同様の戦略を試みました。外部変数queueのみを使用し、queue.popLast()を実行してください。これを実行すると100の結果が得られ、残りのアドレスについてはエラーが発生し始めました。

各ジオコーディング要求の前にsleep(2)を追加しましたが、ブロックなしで4000以上のジオコーディングを抽出することができました。

欠点は - それは時間がかかることです。これをジオコードする予定のアドレスの数に応じて、便利です。

また、私はsleep(1)も試したことがないことに注意してください。 Appleのdocs「最大速度」によると

が指定されていないと、彼らは

あなたが分

私はこれが役に立てば幸いごとに複数のジオコーディングリクエストを送るべきではないことをお勧めします。

乾杯。

+0

あなたの答えをありがとう!あなたの経験に基づいて私が試みるのは私の要求を(私が現在行っているように)直列化することですが、エラーが発生した場合は、失敗した要求を要求するためにsleep()を追加します。私は各要求の間に睡眠を追加することはできません。なぜなら、ユーザーには時間がかかりすぎるからです。別のオプションとして、複数のジオコーディングプロバイダを並行して使用することができます。必要なジオコーディング要求の最大数は500未満です。 – sebastien

関連する問題