func getOkToDownload(response:AcloseCarsToDownload?, error : Error?) -> Void {
if let response = response {
self.response = response
if response.status == "OK" {
if let carsDownloaded = response.cars {
var number = numberCars/(categories?.count)!
number = number == 0 ? 1 : number
let sortedArray = carsDownloaded.sorted {
distance(from: currentLocation!, to: $0.location!) < distance(from: currentLocation!, to: $1.location!)
}
/* let firstPlace = sortedArray.prefix(1) */
cars.append(contentsOf: sortedArray.prefix(number))
}
self.tableView?.reloadData()
} else {
let alert = UIAlertController.init(title: "Error", message: response.status, preferredStyle: .alert)
alert.addAction(UIAlertAction.init(title: "Cancel", style: .cancel, handler: nil))
alert.addAction(UIAlertAction.init(title: "Retry", style: .default, handler: { (action) in
DispatchQueue.main.async {
self.loadPlaces(true)
}
}))
self.present(viewController: alert)
}
isLoading = false
}
else {
print("response is nil")
}
}
この関数を使用して、サーバからダウンロードしたアイテムのリストを作成します。そして、私は配列が塗りつぶされた後にのみ配列する方法
let sortedArray = carsDownloaded.sorted {
distance(from: currentLocation!, to: $0.location!) < distance(from: currentLocation!, to: $1.location!)
}
を追加することでそれを注文すると思ったが、この解決策の問題は、それが各呼び出しでリストをソートすることをされ、結果が希望ではありませんので、このリストは、最寄りから最も公平項目に順序付けられていることを望みます1つは、私は一度完了し、配列が満たされていることを望む、リストが注文されます。どのようにできるのか?
これは、私はあなたが応答の数をカウントし、カテゴリの数と比較し、だけにしてあなたのソート機能を実行する可能性がコメントで言ったように、私はコール
func loadCars(_ force:Bool) {
if !force {
if !canUpdate() {
return
}
}
if(force){
print("load")
iUpdating = true
for category in categories! {
CloseCars.getCloseCars(by: category?.name ?? "berl", coordinates: currentLocation!, radius: radius, token: self.response?.nextPageToken, completion: getOkToDownload)
}
}
}
1つの配列に対するすべての応答を収集し、要素の数がカテゴリの要素の数と等しいかどうかをチェックしてから並べ替え関数を使用できます。または、Rx –
を使用して、コードで例を挙げてください。 – arc4Random