iOS - 如何同时显示多张网络图片?
iOS - how to show multi network images at the same time?
在我的 UIView 上,我有 3 个 UIImageView 来加载 3 个图像 url。众所周知,3个UIImageView加载图片是有时间差的,但是我有一个需求:3个图片全部下载完后,3个UIImageView同时显示这3个图片,怎么办?
所以如果我没理解错的话你想先下载所有 3 张图片然后才显示它们?如果是这样,我建议使用 DispatchGroup。
let images: [URL] = []
let dispatchGroup = DispatchGroup()
for image in images {
dispatchGroup.enter()
URLSession.shared.dataTask(with: image) { (data, response, error) in
// save image data somewhere
dispatchGroup.leave()
}.resume()
}
dispatchGroup.notify(queue: .main) {
// display images on the image view
}
基本上,这是在开始下载时进入调度组,下载完成后离开。每次操作离开组后,您使用通知完成并显示您想要的内容。
如果您的最低支持版本为 iOS 13 并使用 Xcode 13.2,则可以使用 async
和 await
来实现此目的:
func loadImages() {
Task {
async let firstImage = loadImage(index: 1)
async let secondImage = loadImage(index: 2)
async let thirdImage = loadImage(index: 3)
let images = await [firstImage, secondImage, thirdImage]
}
}
func loadImage(index: Int) async -> UIImage {
let imageURL = URL(string: urlPathString)!
let request = URLRequest(url: imageURL)
let (data, _) = try! await URLSession.shared.data(for: request, delegate: nil)
print("Finished loading image \(index)")
return UIImage(data: data)!
}
来源:SwiftLee: Async let explained: call async functions in parallel
在我的 UIView 上,我有 3 个 UIImageView 来加载 3 个图像 url。众所周知,3个UIImageView加载图片是有时间差的,但是我有一个需求:3个图片全部下载完后,3个UIImageView同时显示这3个图片,怎么办?
所以如果我没理解错的话你想先下载所有 3 张图片然后才显示它们?如果是这样,我建议使用 DispatchGroup。
let images: [URL] = []
let dispatchGroup = DispatchGroup()
for image in images {
dispatchGroup.enter()
URLSession.shared.dataTask(with: image) { (data, response, error) in
// save image data somewhere
dispatchGroup.leave()
}.resume()
}
dispatchGroup.notify(queue: .main) {
// display images on the image view
}
基本上,这是在开始下载时进入调度组,下载完成后离开。每次操作离开组后,您使用通知完成并显示您想要的内容。
如果您的最低支持版本为 iOS 13 并使用 Xcode 13.2,则可以使用 async
和 await
来实现此目的:
func loadImages() {
Task {
async let firstImage = loadImage(index: 1)
async let secondImage = loadImage(index: 2)
async let thirdImage = loadImage(index: 3)
let images = await [firstImage, secondImage, thirdImage]
}
}
func loadImage(index: Int) async -> UIImage {
let imageURL = URL(string: urlPathString)!
let request = URLRequest(url: imageURL)
let (data, _) = try! await URLSession.shared.data(for: request, delegate: nil)
print("Finished loading image \(index)")
return UIImage(data: data)!
}
来源:SwiftLee: Async let explained: call async functions in parallel