iOS - 如何同时显示多网络图像?

iOS - how to show multi network images at the same time?

提问人:zhouxinle 提问时间:1/6/2022 更新时间:1/6/2022 访问量:607

问:

在我的 UIView 上,我有 3 个 UIImageView 来加载 3 个图像的 url。众所周知,3 个 UIImageView 加载图片是有时间差的,但是我有一个要求:3 张图片全部下载完后,那么 3 个 UIImageView 同时显示这 3 张图片,怎么办?

iOS Swift Objective-C UIImageView

评论


答:

1赞 Lobont Andrei 1/6/2022 #1

因此,如果我理解正确,您想先下载所有 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
    }

基本上,每当开始下载时,您都会输入调度组,下载完成后,您离开它。每次操作离开组后,您都会使用通知完成并显示所需的内容。

评论

0赞 zhouxinle 1/6/2022
你的意思是第一步下载3张图片,下载后,显示?
0赞 Lobont Andrei 1/6/2022
如果您希望同时显示所有 3 张图像,您需要先下载它们,因为正如您所说,它们之间的下载时间可能存在差异。
0赞 zhouxinle 1/6/2022
顺便问一下,你知道在 Flutter 中怎么做吗?
0赞 Lobont Andrei 1/6/2022
很抱歉,不,对不起。
1赞 Ramy Rizkalla 1/6/2022 #2

如果您拥有 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:异步let 解释:并行调用异步函数