swift - 异步图像下载功能 Swift - 有些图像不返回

标签 swift

出于某种原因,此函数对大多数图像返回有效图像,但对于某些图像,它什么也不返回。它显示正在交换数据,但未正确返回图像。谁能帮我改进这个功能,看看如何解决这个问题。

    func imageForUrl(urlString: String, completionHandler:(image: UIImage?, url: String) -> ()) {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), {()in
        var data: NSData? = self.cache.objectForKey(urlString) as? NSData

        if let goodData = data {
            let image = UIImage(data: goodData)
            dispatch_async(dispatch_get_main_queue(), {() in
                completionHandler(image: image, url: urlString)
            })
            return
        }

        var downloadTask: NSURLSessionDataTask = NSURLSession.sharedSession().dataTaskWithURL(NSURL(string: urlString)!, completionHandler: {(data: NSData!, response: NSURLResponse!, error: NSError!) -> Void in
            if (error != nil) {
                println(error)
                completionHandler(image: nil, url: urlString)
                return
            }

            if data != nil {
                println(data)
                let image = UIImage(data: data)
                self.cache.setObject(data, forKey: urlString)
                dispatch_async(dispatch_get_main_queue(), {() in
                    completionHandler(image: image, url: urlString)
                })
                return
            }

        })
        downloadTask.resume()
    })
}

这是我正在使用的整个类(class),它也有作者的学分。

//
//  ImageLoader.swift
//  extension
//
//  Created by Nate Lyman on 7/5/14.
//  Copyright (c) 2014 NateLyman.com. All rights reserved.
//
import UIKit
import Foundation


class ImageLoader {

    var cache = NSCache()

    class var sharedLoader : ImageLoader {
        struct Static {
            static let instance : ImageLoader = ImageLoader()
        }
        return Static.instance
    }

    func imageForUrl(urlString: String, completionHandler:(image: UIImage?, url: String) -> ()) {
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), {()in
            var data: NSData? = self.cache.objectForKey(urlString) as? NSData

            if let goodData = data {
                let image = UIImage(data: goodData)
                dispatch_async(dispatch_get_main_queue(), {() in
                    completionHandler(image: image, url: urlString)
                })
                return
            }

            var downloadTask: NSURLSessionDataTask = NSURLSession.sharedSession().dataTaskWithURL(NSURL(string: urlString)!, completionHandler: {(data: NSData!, response: NSURLResponse!, error: NSError!) -> Void in
                if (error != nil) {
                    println(error)
                    completionHandler(image: nil, url: urlString)
                    return
                }

                if data != nil {
                    println(data)
                    let image = UIImage(data: data)
                    self.cache.setObject(data, forKey: urlString)
                    dispatch_async(dispatch_get_main_queue(), {() in
                        completionHandler(image: image, url: urlString)
                    })
                    return
                }

            })
            downloadTask.resume()
        })
    }
}

最佳答案

您在不同的线程中使用 self.cache:dispatch_asyncdataTaskWithURL

不要重新发明轮子,对这类事情使用经过良好测试的库

https://github.com/Alamofire/Alamofire

下载图像并将它们存储在缓存中并不是 iOS 上简单的编程任务。

此外,您还可以使用同一作者的 Objective-C 库

https://github.com/AFNetworking/AFNetworking

它有一个有用的 UIImageView 类别,可以直接在您的 UI 控件中下载图像(并将它们存储在系统和内存缓存中)。

关于swift - 异步图像下载功能 Swift - 有些图像不返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28661734/

相关文章:

ios - 在协议(protocol)扩展中将 nil 传递给具有可选的一般约束参数的函数

iOS:在处理每帧视频并用音频文件重写时收到内存警告

swift - UITableViewCell 中的 UISwitch 一起更改状态

ios - Swift 相当于 PackageInfo 和 ApplicationInfo

ios - 在 swift 中从 HTML 字符串创建 PDF 文件时如何设置 pdf 中的底部空间?

swift - “ fatal error :在展开可选值时意外发现nil”是什么意思?

ios - 在 Swift 中搜索字符串中的子字符串不起作用

ios - API 调用只在循环中返回一次响应

swift - 根据位置半径过滤 Firebase 数据库

ios - 显示在 Collection View Controller 之间选择的图像