UIIMage 解码 for 循环中不一致的行为

问题描述

首先 - 问题

问题是当运行函数 loadImages() 时,除最后一个之外的所有 UIImage 对象都以 nil 的形式返回。更深入地描述: 我有 8 个图片 url,前 7 个在解码时返回 nil,最终 url 成功解码并作为 UIImage 返回。

我尝试了几种调试方法

更改了从 api 返回的 url 数量,该函数仍然为每个 URL 始终返回 nil,除了从 api 返回的数组中的最终 url。

我还更改了 API 以仅返回成功解码为 UIImage 对象的 url 的数组,该函数仍然为除最终 url 之外的每个 url 返回 nil,即使它们都是相同的 URL!

我真的很迷茫,睡眠不足,而且是 swift 的新手,所以如果有任何帮助来弄清楚我错过了什么,那将是非常有帮助的!下面我分享了我所有的代码,我真的希望这是我遗漏的一些小东西!

第二 - 我的代码

这里我有一个网络请求,该请求正在发送并获取一个图像 url 列表,这些 url 列表在 json 数组中返回,包装键为“item”

func fetchImageUrls() {
        guard !isLoading else {
            return
        }
        isLoading = true
        let resource = ImageUrlsResource()
        let request = APIRequest(resource: resource)
        self.request = request
        request.execute {[weak self] urls in
            self?.imageUrls = urls ?? []
            self?.isLoading = false
            self?.loadImages()
            
        }
    }

这将返回图像 url 并将它们正确格式化为 imageUrls 数组。 loadImages 函数如下:

func loadImages() {
        for i in imageUrls {
            let url = URL(string: i.url)
            print(url)
            guard let requestUrl = url else {fatalError()}
            let request = URLRequest(url: requestUrl)
            let imageRequest = ImageRequest(url: request)
            self.imageRequest = imageRequest
            imageRequest.execute { [weak self ] image in
                print(image) // here is returning nill
                let finalImage = FinalImage(id: i.id,image: image ?? nil)
                self?.finalImages.append(finalImage)
            }
        }
    }

这里是图片请求类

class ImageRequest {
    let url: URLRequest
    
    init(url: URLRequest) {
        self.url = url
    }
}

extension ImageRequest: NetworkRequest {
    func decode(_ data: Data) -> UIImage? {
        return UIImage(data: data)
    }
    func execute(withCompletion completion: @escaping (UIImage?) -> Void) {
        load(url,withCompletion: completion)
    }
}

和网络请求协议:

protocol NetworkRequest: AnyObject {
    associatedtype ModelType
    func decode(_ data: Data) -> ModelType?
    func execute(withCompletion completion: @escaping (ModelType?) -> Void)
}

extension NetworkRequest {
    fileprivate func load(_ url: URLRequest,withCompletion completion: @escaping (ModelType?) -> Void) {
        let task = URLSession.shared.dataTask(with: url) {[weak self] (data,response,error) -> Void in
            guard let data = data,let value = self?.decode(data) else {
                dispatchQueue.main.async {
                    completion(nil)
                }
                return
            }
            dispatchQueue.main.async {
                completion(value)
            }
        }
        task.resume()
}
}

感谢任何帮助!!

编辑在这些点的函数添加了一些打印语句

func loadImages() {
        for i in imageUrls {
            let url = URL(string: i.url)
            print(url)
            guard let requestUrl = url else {fatalError()}
            let request = URLRequest(url: requestUrl)
            let imageRequest = ImageRequest(url: request)
            self.imageRequest = imageRequest
            imageRequest.execute { [weak self ] image in
                print(image)
                print("fetching the image")
                let finalImage = FinalImage(id: i.id,image: image ?? nil)
                self?.FinalImages.append(finalImage)
            }
        }
    }


extension ImageRequest: NetworkRequest {
    func decode(_ data: Data) -> UIImage? {
        print("DATA \(data)")
        return UIImage(data: data)
    }
    func execute(withCompletion completion: @escaping (UIImage?) -> Void) {
        load(url,withCompletion: completion)
    }
}

这是控制台的输出

Optional(https://dummyimage.com/455x276.png/cc0000/ffffff)
Optional(https://dummyimage.com/455x276.png/cc0000/ffffff)
Optional(https://dummyimage.com/455x276.png/cc0000/ffffff)
Optional(https://dummyimage.com/455x276.png/cc0000/ffffff)
Optional(https://dummyimage.com/455x276.png/cc0000/ffffff)
Optional(https://dummyimage.com/455x276.png/cc0000/ffffff)
Optional(https://dummyimage.com/455x276.png/cc0000/ffffff)
Optional(https://dummyimage.com/455x276.png/cc0000/ffffff)
Optional(https://dummyimage.com/455x276.png/cc0000/ffffff)
Optional(https://dummyimage.com/455x276.png/cc0000/ffffff)
Optional(https://dummyimage.com/455x276.png/cc0000/ffffff)
Optional(https://dummyimage.com/455x276.png/cc0000/ffffff)
Optional(https://dummyimage.com/455x276.png/cc0000/ffffff)
nil
fetching the image
nil
fetching the image
nil
fetching the image
nil
fetching the image
nil
fetching the image
nil
fetching the image
nil
fetching the image
DATA 1297 bytes
nil
fetching the image
nil
fetching the image
nil
fetching the image
nil
fetching the image
nil
fetching the image
Optional(<UIImage:0x60000057d950 anonymous {455,276}>)
fetching the image

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)