【iOS版】如何下载一组图片

有没有遇过这种情况?在Instagram的上看到一篇PO文,就想把这篇PO文的图片载下来。方法有很多种,但身为一个有工程师灵魂的人,每次都要传连结到电脑去,点免费网站下载,或是用浏览器从原始码找资源,真的是不太爽。那么,为什么不干脆写一个APP来载图呢?

时间的关系,省略之前千辛万苦拿到图片网址的过程。终于拿到网址后,才发现,发送网路请求是一个非同步的过程,要怎么处理才能按照顺序,把图片一张一张下载下来呢?

let photoUrlArray: [String] = [
"https://instagram.ftpe4-1.fna.fbcdn.net/vp/8a52c610c47742dd36fddd9583507056/5D6A6F8A/t51.2885-15/e35/51356637_118784882570192_5855904060945345504_n.jpg?_nc_ht=instagram.ftpe4-1.fna.fbcdn.net",
"https://instagram.ftpe4-1.fna.fbcdn.net/vp/7284a45c0d75a58b2965c3592e4ef8b3/5D5AB931/t51.2885-15/e35/51830506_2017145361919413_4673338561841243634_n.jpg?_nc_ht=instagram.ftpe4-1.fna.fbcdn.net"
]

同步 vs 非同步

同步(synchronous)就是要等,非同步(asynchronous)就是不等。

用吃饭来举例,同步就像买便当,一道菜装完才装下一道,全部装完后,包起来交给你,每个人都要等前一个人完成动作才能做;而非同步就像去吃热炒,点了一堆菜,哪道菜先做好哪道先送过来,送过来后就看你要怎么吃它。

若用同步的方式写下载,这个下载的指令没有完成前,不会执行下一行指令,大家都得等它做完才继续执行。而用非同步的方式去写下载,执行下载指令后,就直接往下一行去执行,等到下载结束后,再执行下载指令的回呼函式。

开始下载

let images = [UIImage]()
for urlString in photoUrlArray {
do {
let imageData = try Data.init(contentsOf: URL.init(string: urlString)!)
let image = UIImage.init(data: imageData)
images.append(image!)
} catch {
}
}

Data.init(contentsOf: url: URL)是同步函式,所以我们可以就像平常一样,把它放进了回圈内,而不用去担心哪个请求什么时候回应,要怎么样才能照顺序把图片下载下来的问题。图片会一张载完后,才换下一张,直到通通载完。

至于非同步

非同步的写法也不难,就是先下载第一张图片,然后在回呼函式中,确认阵列中还有没有下一张图片,有就继续下载,没有就把下载完的图片阵列,传给另外的函示去处理。

转载需保留链接来源:VCBeta.CN » 【iOS版】如何下载一组图片

赞 (0)