Swift 迅速完成及;循环问题

Swift 迅速完成及;循环问题,swift,download,alamofire,handler,completion,Swift,Download,Alamofire,Handler,Completion,正在尝试从三个URL之一下载PKG文件。该逻辑基本上从每个下载url中查找下载的延迟,并将最终下载url设置为延迟最低的主机 import Cocoa import Alamofire // Create my object via Struct struct Package { var latency: Double? var name: String? var statuscode: Int? var download: Bool? var down

正在尝试从三个URL之一下载PKG文件。该逻辑基本上从每个下载url中查找下载的延迟,并将最终下载url设置为延迟最低的主机

import Cocoa
import Alamofire

// Create my object via Struct
struct Package {
    var latency: Double?
    var name: String?
    var statuscode: Int?
    var download: Bool?
    var downloadUrl: String? 
}
// Download the package from the provided download url and return the object
func getPKG(pkgName: String, dpUrl: String, completion: @escaping (Package) -> (Package)) {
    let url = URL(string: "\(dpUrl)\(pkgName)")
    let parameters: Parameters = ["foo":"bar"]
    Alamofire.download(url, method: .get, parameters: parameters, encoding: JSONEncoding.default, to: destination)
        .downloadProgress(queue: DispatchQueue.global(qos: .utility)) { progress in
            debugPrint("Download Progress...: \(progress.fractionCompleted)")
        }
        .validate(statusCode: 200..<399)
        .response { response in
            debugPrint(response.response!)
            debugPrint(response.response!.statusCode)
            debugPrint(response.timeline.latency)
            let dlObject = Package(latency: response.timeline.latency, name: pkgName, statuscode: response.response?.statusCode, download: true, downloadUrl: dpUrl)
            completion(dlObject)
    }

}

var share_response = [String: Double]()
var package_sources: NSArray! = ["https://www.jss1.com/Share", "https://www.jss2.com/Share", "https://www.jss3.com/Share"]
let package_names: String = ["Dummy1.pkg", "Dummy2.pkg", "Dummy3.pkg"]
// Loop through the package sources and find the one with 
// the lowest latency.
for share_url in package_sources {
    getPKG(pkgName: "Dummy.pkg", dpUrl: share_url, completion: {
        dlObject in
        if dlObject.latency != nil {
            share_response[share_url] = dlObject.latency
        } else {
            debugPrint("nothing yet")
        }
        return dlObject
    })
}

let final_download_url = share_response.min { a, b in a.value < b.value }

//  Here is where it breaks and responds with nil

for package in package_names {
    let download_url = URL(string: final_download_url + package)
    Download commands here...
}
导入可可粉
进口阿拉莫菲尔
//通过Struct创建我的对象
结构包{
var延迟:双倍?
变量名称:字符串?
变量状态码:Int?
var下载:Bool?
var downloadUrl:String?
}
//从提供的下载url下载包并返回对象
func getPKG(pkgName:String,dpUrl:String,completion:@escaping(Package)->(Package)){
让url=url(字符串:“\(dpUrl)\(pkgName)”)
let参数:参数=[“foo”:“bar”]
下载(url,方法:.get,参数:参数,编码:JSONEncoding.default,收件人:目标)
.downloadProgress(队列:DispatchQueue.global(qos:.实用工具)){中的进度
debugPrint(“下载进度…:\(Progress.fractionCompleted)”)
}

.验证(状态代码:200..基于@vadian at的答案

。。。
let group=DispatchGroup()
var share_response=[String:Double]()
变量包_来源:NSArray!=[”https://www.jss1.com/Share", "https://www.jss2.com/Share", "https://www.jss3.com/Share"]
让包名为:String=[“Dummy1.pkg”、“Dummy2.pkg”、“Dummy3.pkg”]
//循环浏览包源代码,并找到具有
//最低延迟。
用于包\u源中的共享\u url{
group.enter()
getPKG(pkgName:Dummy.pkg),dpUrl:share\u url,完成:{
小组请假()
dlobjectin
如果dlObject.latency!=nil{
共享响应[共享url]=dlObject.latency
}否则{
debugPrint(“还没有”)
}
返回dlObject
})
}
通知组(队列:DispatchQueue.main){
让final_download_url=share_response.min{a,b在a.value
(包)->(包)
无法工作。您需要
DispatchGroup
来同步循环中的网络请求。顺便说一句,类型注释
:NSArray!
非常糟糕。它既不是
NSArray
也不是可选的。从不注释编译器可以推断出更好的类型。这不是Javascript:变量名应该是camelCased@vadian我很快就把这篇文章整理好了,并且编辑了很多公司特有的东西,所以我不太关心变量名。我想让它尽可能的通用。我真的很感激你的回答/评论,这些都是我将收回的优秀观点。你能举一个例子说明它与Dispa的关系吗tchGroup?我刚刚给@vadian写了一个答案。我已经看了另一篇文章,并开始编辑代码进行测试,但是有一个问题是关于group.notify部分的。我应该将该部分放在我发布的代码中的什么位置?@vadian&ekscrypto,谢谢你的帮助。这就是我所需要的。我现在可以成功地从pro中找到最低延迟查看URL,选择最快的主机,然后相应地从该主机下载软件包。再次感谢!
...

let group = DispatchGroup()
var share_response = [String: Double]()
var package_sources: NSArray! = ["https://www.jss1.com/Share", "https://www.jss2.com/Share", "https://www.jss3.com/Share"]
let package_names: String = ["Dummy1.pkg", "Dummy2.pkg", "Dummy3.pkg"]
// Loop through the package sources and find the one with 
// the lowest latency.
for share_url in package_sources {
    group.enter()
    getPKG(pkgName: "Dummy.pkg", dpUrl: share_url, completion: {
        group.leave()
        dlObject in
        if dlObject.latency != nil {
            share_response[share_url] = dlObject.latency
        } else {
            debugPrint("nothing yet")
        }
        return dlObject
    })
}

group.notify(queue: DispatchQueue.main) {    
    let final_download_url = share_response.min { a, b in a.value < b.value }

    //  Here is where it breaks and responds with nil

    for package in package_names {
        let download_url = URL(string: final_download_url + package)
        Download commands here...
    }
}