基本的に私はいくつかのJSONデータを(同じホストからの)複数のURLから取得したいと考えていますが、このデータは最低でも2秒ごとにしか要求できません。サーバーから「禁止されている時間」。あなたが下記で見るように。 URLSessionは非常に速いですが、私は約700個のURLを持っていれば、ほとんど即座に禁止されています。Swift 4:URLSessionDataTaskを非同期的に使用する方法はありますが、要求はタイム・キューに入れられますか?
URLSession(その機能がサポートしている場合)でキューを作成する方法と、メインスレッドと非同期で動作させる方法はありますか。それ自身のスレッドで連続して動作し、前の要求を終了してから2秒後にキュー内の各項目を試行しますか?
for url in urls {
get(url: url)
}
func get(url: URL) {
let session = URLSession.shared
let task = session.dataTask(with: url, completionHandler: { (data, response, error) in
if let error = error {
DispatchQueue.main.async {
print(error.localizedDescription)
}
return
}
let data = data!
guard let response = response as? HTTPURLResponse, response.statusCode == 200 else {
DispatchQueue.main.async {
print("Server Error")
}
return
}
if response.mimeType == "application/json" {
do {
let json = try JSONSerialization.jsonObject(with: data) as! [String: Any]
if json["success"] as! Bool == true {
if let count = json["total_count"] as? Int {
DispatchQueue.main.async {
self.itemsCount.append(count)
}
}
}
} catch {
print(error.localizedDescription)
}
}
})
task.resume()
}
を解決しますが、低速の接続になり、サーバーの呼び出しの間の実際の時間は変更になる場合があります場合はどう、 'get'がすぐに戻るからです。 –
@DenisLitvinその場合、要求の一部が失敗し、エラーメッセージが出力されます。それを処理したい場合は、urlsessionデータタスクからタイムアウト設定を行う必要があります。 –
いいえ、そのIPはサーバーの制限により禁止されます。これは質問の中で述べたように –