进行多个URL调用以检索图像

时间:2017-01-09 01:02:39

标签: ios swift3 chat xcode8

我是iOS编程新手,我有一个概念性和功能性问题。我试着查看SO线程,但没有得到符合我情况的确切问题。

我正在构建一个简单的屏幕,其中显示用户名列表及其头像 - 类似于典型的“联系人”屏幕。

我正在使用UITableview来实现此目的。 我首先进行HTTP GET调用以检索用户列表,这些用户返回带有名称的JSON和下载其图像的URL。然后我将此信息存储到Core Data中并缓存图像。

我正在努力处理下载图片并将其设置为UIImageView.image的部分。

  1. 从概念上讲,我应该使用哪种方法来获取名称和图片网址 - viewDidLoadviewWillAppear?在我看来,我应该在后续调用中使用viewWillAppear,我将从Core Data获取列表并且没有网络活动?
  2. tableView:cellForRowAtIndexPath是我用来获取与每行对应的图像的函数。这是对的吗?
  3. 任何帮助或指向重复的问题都会有所帮助!谢谢!

2 个答案:

答案 0 :(得分:0)

  1. viewDidLoad
  2. 中获取姓名和网址
  3. 制作一个自定义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
            }
        }
    }
    

    Download image from url

答案 1 :(得分:0)

您可以从以下代码下载所有图像异步处理...

Swift 3

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!))