我在Swift 2.0中制作了一个应用程序,我在原型单元格中使用带有图像视图的表格视图。该应用程序从Facebook服务器下载一些图像,我想显示它们。这些图片都是从不同的网址下载的,所以我正在使用一个程序来循环播放和下载,就像我用名字一样从互联网上显示它们并显示,但我有点卡住了..
func fetchPicture(identifier: String, completion: (image: UIImage) -> Void)
{
let url2 = NSURL (string: "http://graph.facebook.com/" + identifier + "/picture?type=normal")
let urlRequest = NSURLRequest(URL: url2!)
NSURLConnection.sendAsynchronousRequest(urlRequest, queue: NSOperationQueue.mainQueue()) {
(response, data, error) -> Void in
if error != nil
{
print(error)
}
else
{
if let pf = UIImage(data: data!)
{
dispatch_async(dispatch_get_main_queue())
{
completion(image: pf)
self.tableView.reloadData()
}
}
}
}}
var images = [UIImage]()
let queue2 = dispatch_queue_create("images", DISPATCH_QUEUE_SERIAL)
dispatch_apply(newArray.count, queue2) { index in
let identifier = newArray[index]
fetchPicture(identifier) {
image in dispatch_async(queue2)
{
}
}
}
我将单元格中的imageview设置为等于变量' image'所以基本上我需要做一些像self.image = pf这样的事情,但每个用户需要有所不同。有了名字,我用数组做了这个,但这并不是我假设的图像。
帮助非常感谢大家! 谢谢!
答案 0 :(得分:0)
您通常不希望像这样加载所有图像。你肯定不想在每个图像之后重新加载整个表格(因为这会导致它滚动回到tableview的顶部)。
通常建议懒惰地获取图像(即直到他们需要)。您可以从fetchPicture
调用cellForRowAtindexPath
,然后在完成处理程序中相应地更新单元格的图像视图。
但是你需要担心一些细节:
首先,在完成提取时,单元格可能已被重用,因此您必须检查以确保单元格仍然可见。
其次,我建议使用NSCache
而不是使用数组,并确保在内存压力下清除此缓存。您可能还希望缓存到持久存储,但有些人更喜欢依赖NSURLCache
机制
第三,如果单元格滚出视图,您可能希望取消该请求(例如,如果您快速滚动到第100行,该图像请求不会被追溯到后面对不再可见的单元格的其他99个图像请求。
就个人而言,考虑到正确执行此操作所需的所有工作,我建议您考虑使用完善的异步图像提取机制,例如SDWebImage,DFImageManager或Kingfisher。查看提供异步图像加载的UIImageView
类别/扩展。要自己做好这一切是非常重要的练习,所以最好使用一些提供异步图像视图检索机制的现有库。
答案 1 :(得分:0)
您通常希望使用专门针对这类内容的框架。我不建议使用SDWebImage,它已经过时(没有NSURLSession),有很多未解决的问题,并且不能很好地使用Swift(没有可空性注释)。
看看这两个与iOS平台最新的库: