出于某种原因,此函数对大多数图像返回有效图像,但对于某些图像,它什么也不返回。它显示正在交换数据,但未正确返回图像。谁能帮我改进这个功能,看看如何解决这个问题。
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_async
与 dataTaskWithURL
。
不要重新发明轮子,对这类事情使用经过良好测试的库
下载图像并将它们存储在缓存中并不是 iOS 上简单的编程任务。
此外,您还可以使用同一作者的 Objective-C 库
它有一个有用的 UIImageView 类别,可以直接在您的 UI 控件中下载图像(并将它们存储在系统和内存缓存中)。
关于swift - 异步图像下载功能 Swift - 有些图像不返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28661734/