我是iOS编程新手,我有一个概念性和功能性问题。我试着查看SO线程,但没有得到符合我情况的确切问题。
我正在构建一个简单的屏幕,其中显示用户名列表及其头像 - 类似于典型的“联系人”屏幕。
我正在使用UITableview
来实现此目的。
我首先进行HTTP GET调用以检索用户列表,这些用户返回带有名称的JSON和下载其图像的URL。然后我将此信息存储到Core Data中并缓存图像。
我正在努力处理下载图片并将其设置为UIImageView.image
的部分。
viewDidLoad
或viewWillAppear
?在我看来,我应该在后续调用中使用viewWillAppear
,我将从Core Data获取列表并且没有网络活动?tableView:cellForRowAtIndexPath
是我用来获取与每行对应的图像的函数。这是对的吗?任何帮助或指向重复的问题都会有所帮助!谢谢!
答案 0 :(得分:0)
viewDidLoad
。制作一个自定义UITableViewCell
,其中包含网址的图片。在didSet
(对于url属性),下载图片并设置UIImageView
的图片:
class CustomTableViewCell: UITableViewCell
var url: URL? = nil {
didSet {
//download and set image.
//example code can be found at the link below
}
}
}
答案 1 :(得分:0)
您可以从以下代码下载所有图像异步处理...
private let downloadQueue = DispatchQueue(label: "me.readytoImage.downloadQueue", attributes: [])
class MainViewController: UIViewController {
fileprivate var photos = [URL]()
fileprivate var cache = NSCache<AnyObject, AnyObject>()
// MARK: - Image Downloading block
fileprivate func downloadPhoto(_ url: URL, completion: @escaping (_ url: URL, _ image: UIImage) -> Void) {
downloadQueue.async(execute: { () -> Void in
if let data = try? Data(contentsOf: url) {
if let image = UIImage(data: data) {
DispatchQueue.main.async(execute: { () -> Void in
self.cache.setObject(image, forKey: url as AnyObject)
completion(url, image)
})
}
}
})
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellIdentifier, for: indexPath) as! PhotoCell
let url = photos[indexPath.item]
//check cache images
let image = cache.object(forKey: url as AnyObject) as? UIImage
cell.imageView.backgroundColor = UIColor(white: 0.95, alpha: 1)
cell.imageView.image = image
//Downloading images
if image == nil {
downloadPhoto(url, completion: { (url, image) -> Void in
let indexPath_ = collectionView.indexPath(for: cell)
if indexPath == indexPath_ {
cell.imageView.image = image
}
})
}
return cell
}
否则您还可以在 Swift 3中使用Kingfisher SDK下载图片。
let url = json["image"] as? String
cell.imageProfile.kf.setImage(with: URL(string: url!))