Swift 与GCD同时处理数组项

Swift 与GCD同时处理数组项,swift,grand-central-dispatch,Swift,Grand Central Dispatch,为了大大简化问题,假设我有一个由三个图像URL组成的Swift数组,我想这样下载: let urls:[String] = [ "http://acme.com/one.jpeg", "http://acme.com/two.jpeg", "http://acme.com/three.jpeg", ] for url in urls { downloadImage(url) } print("all images downloaded.") 如果我想并行下载

为了大大简化问题,假设我有一个由三个图像URL组成的Swift数组,我想这样下载:

let urls:[String] = [
    "http://acme.com/one.jpeg",
    "http://acme.com/two.jpeg",
    "http://acme.com/three.jpeg",
]

for url in urls {
    downloadImage(url)
}

print("all images downloaded.")
如果我想并行下载所有文件,该怎么办?在读了Swift中的Grand Central Dispatch(GCD)和异步编程之后,我仍然不确定如何解决这个“问题”。我不想修改数组,我只想并行执行
downloadImage(url)
任务


提前谢谢。

我建议您使用DispatchGroup,我不知道您将如何下载图像,但代码示例如下所示

    private func downloadAll() {

    let urls:[String] = [
        "http://acme.com/one.jpeg",
        "http://acme.com/two.jpeg",
        "http://acme.com/three.jpeg",
    ]
    let group = DispatchGroup()
    for url in urls {
        group.enter()
        downloadImage(url) {
            group.leave()
        }
    }
    group.notify(queue: .main) {
        print("all images downloaded")
    }
}

func downloadImage(_ url: String, @escaping block: () -> ()) {
    // your code to download
    // in completion block call block()
    // it will call block in for loop to leave the group
}

希望它能帮助你,下载你可以使用SDWebImage框架,它使用起来很简单

也许这能帮你一点忙,谢谢。Xcode抱怨
属性只能应用于类型,不能使用
转义
参数声明。我如何修复它?您可以删除@escaping,错误将消失,但在实现下载代码时需要添加此属性。代码现在可以正常编译了。但是在调用
回调之前,我在
下载图像的主体中添加了
sleep(3)
print(url)
。结果是,我看到控制台每三秒打印一次。如果这是真正的异步,我应该在三秒后看到所有三个控制台输出,对吗?不,要一次获得三个输出,您需要压缩响应,执行所有代码后,您将看到“所有图像下载”,异步意味着无论何时获得任何响应,这就像三辆车以不同的速度行驶在一条路上,你不知道谁会第一个完成