我用它来加载URL到图像视图
let url = NSURL(string: URL)
let data = NSData(contentsOfURL: url!)
self.releasephoto.image = UIImage(data: data!)
Run Code Online (Sandbox Code Playgroud)
但是当表视图单元格中有10个项目具有不同的图像时,滚动会变慢并挂起
我加载大小为40 X 40的图像
我想知道是否有更好的方法来加载URL图像?
Sam*_*Sam 21
我建议使用SDWebImage.
安装完成后,您需要为Swift创建一个桥接头并包含以下行:
#import "UIImageView+WebCache.h"
Run Code Online (Sandbox Code Playgroud)
那么你需要在你的cellForRowAtIndexPath函数中做的就是:
let url = NSURL(string: URL)
self.releasephoto.sd_setImageWithURL(url)
Run Code Online (Sandbox Code Playgroud)
这个库的好处是它会自动缓存图像,所以它只下载一次.
您必须异步加载视图.最初提供虚拟或空白图像.然后在后台异步加载到模型中,显示当前显示的单元格的任何图像.当每个图像到达时,将其存储在模型中并重新加载表视图.因此每个图像都会在它到达时出现,但是你的滚动不会因为总是有一个图像而变慢- 如果你没有为这一行提取图像,则为空白或虚拟图像,如果你已经提取了图像,则为真实图像它.
这是我书中的示例代码:
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath:indexPath) as UITableViewCell
let m = self.model[indexPath.row]
cell.textLabel!.text = m.text
// have we got a picture?
if let im = m.im {
cell.imageView!.image = im
} else {
if m.task == nil { // no task? start one!
cell.imageView!.image = nil
m.task = self.downloader.download(m.picurl) { // *
[weak self] url in // *
m.task == nil // *
if url == nil {
return
}
let data = NSData(contentsOfURL: url)!
let im = UIImage(data:data)
m.im = im
dispatch_async(dispatch_get_main_queue()) {
self!.tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: .None)
}
}
}
}
return cell
}
Run Code Online (Sandbox Code Playgroud)
(完整的工作示例就在这里.而MyDownloader的代码self.downloader就在这里.)
为了获得额外的超级效率,如果用户在图像到达之前将一行拖出视图,请取消下载.这样,您可以设置一次可以进行多少次下载的上限.
我已经在这里回答了类似的问题
使用以下类:
class ImageLoadingWithCache {
var imageCache = [String:UIImage]()
func getImage(url: String, imageView: UIImageView, defaultImage: String) {
if let img = imageCache[url] {
imageView.image = img
} else {
let request: NSURLRequest = NSURLRequest(URL: NSURL(string: url)!)
let mainQueue = NSOperationQueue.mainQueue()
NSURLConnection.sendAsynchronousRequest(request, queue: mainQueue, completionHandler: { (response, data, error) -> Void in
if error == nil {
let image = UIImage(data: data)
self.imageCache[url] = image
dispatch_async(dispatch_get_main_queue(), {
imageView.image = image
})
}
else {
imageView.image = UIImage(named: defaultImage)
}
})
}
}
}
Run Code Online (Sandbox Code Playgroud)
用法:
var cache = ImageLoadingWithCache()
cache.getImage(YOUR_URL, imageView: YOUR_IMAGEVIEW, defaultImage: "DEFAULT_IMAGE_NAME")
Run Code Online (Sandbox Code Playgroud)