与 GCD 同时处理数组项
Posted
技术标签:
【中文标题】与 GCD 同时处理数组项【英文标题】:Processing array items concurrently with GCD 【发布时间】:2019-07-30 13:35:18 【问题描述】:为了大大简化问题,假设我有一个由三个图像 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.")
如果我想并行下载所有文件怎么办?在阅读了关于 Grand Central Dispatch (GCD) 和 Swift 中的异步编程之后,我仍然不确定如何解决这个“问题”。我不想修改数组,我只想实现downloadImage(url)
任务的并行执行。
提前致谢。
【问题讨论】:
也许这可以帮助一点***.com/questions/50042458/… 【参考方案1】:我建议你使用 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
参数抱怨Attribute can only be applied to types, not declarations
。我该如何解决?
你可以去掉@escaping,错误就会消失,但是你需要在实现下载代码时添加这个属性
代码现在编译得很好。但是在downloadImage
的正文中,我在调用block
回调之前添加了sleep(3)
和print(url)
。结果是我每三秒在控制台中看到一次打印。如果那是真正的异步,我应该在三秒后看到所有三个控制台输出,对吧?
不,要一次获得三个输出,您需要压缩响应,在执行所有代码后,您将看到“所有图像已下载”,异步意味着无论何时您都会得到任何响应,就像三辆不同速度的汽车在路上,你不知道谁会先跑完以上是关于与 GCD 同时处理数组项的主要内容,如果未能解决你的问题,请参考以下文章