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,则可以使用 asyncawait 来实现此目的:

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