使用 Alamofire 下载图像并在 UITableViewCell 中显示

Posted

技术标签:

【中文标题】使用 Alamofire 下载图像并在 UITableViewCell 中显示【英文标题】:Download images using Alamofire and display in UITableViewCell 【发布时间】:2017-05-18 05:27:25 【问题描述】:

我有这两个功能:

func callAlamo(url: String)
    Alamofire.request(url).responseJSON(completionHandler: 
        response in

        self.parseData(JSONData: response.data!)

    )


func parseData(JSONData: Data) 
    do 
        var readableJSON = try JSONSerialization.jsonObject(with: JSONData, options: .mutableContainers) as! JSONStandard
        if let tracks = readableJSON["tracks"] as? JSONStandard
            if let items = tracks["items"] as? [JSONStandard]
                for i in 0..<items.count
                    let item = items[i]
                    let name = item["name"] as! String

                    if let album = item["album"] as? JSONStandard
                        if let images = album["images"] as? [JSONStandard]
                            let imageData = images[0]
                            let mainImageUrl = URL(string: imageData["url"] as! String)
                            let mainImageData = NSData(contentsOf: mainImageUrl!)

                            let mainImage = UIImage(data: mainImageData as! Data)
                            posts.append(post.init(image: mainImage, name: name))

                            self.tableView.reloadData()
                        
                    
                
            
        
    
    catch
        print(error)
    

使用 alamofire 从 Spotify 检索歌曲信息。这些函数是在 UITableViewController 类中设置的。我在设置此图像的同一文件中设置了一个单独的 UITableViewCell 类:

let albumCoverImageView: UIImageView = 
    let imageView = UIImageView()
    imageView.translatesAutoresizingMaskIntoConstraints = false

    return imageView
()

我将如何使用从这两个函数中检索到的信息到该图像中?因为我无法从图像模仿中访问这些功能。

【问题讨论】:

您可以将图像存储在单独的成员变量中。由于您正在调用reloadData,它将调用tableView的委托方法,然后您可以在cellForRowAtIndexPath中设置图像。 如何将图像存储在单独的成员变量中? 【参考方案1】:

使用“SDWebImage”库异步下载图像。

参考以下链接:-

https://github.com/rs/SDWebImage

用法:-

目标-C:

#import <SDWebImage/UIImageView+WebCache.h>
[imageView sd_setImageWithURL:[NSURL 
URLWithString:imageURL]
         placeholderImage:[UIImage imageNamed:@"placeholder.png"]];

斯威夫特:

import SDWebImage

imageView.sd_setImage(with: URL(string: imageURL), placeholderImage: UIImage(named: "placeholder.png"))

【讨论】:

这在今天仍然很重要,帮助很大。谢谢。【参考方案2】:
var imgFinal = [String:UIImage]()

将图像存储在 func parseData() 的“imgFinal”数组中:

self.imgArrList[i] = imageData["url"]


func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 


  let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! CategoryTableViewCell
    load_image((imgArrList[indexPath.row] as? String)!, imageview: cell.titleImage, indVal: indexPath.row)
return cell

添加此方法下载图片:

func load_image(link:String, imageview:UIImageView, indVal:Int)


    let url:NSURL = NSURL(string: link)!
    let session = NSURLSession.sharedSession()

    let request = NSMutableURLRequest(URL: url)
    request.timeoutInterval = 10

    let task = session.dataTaskWithRequest(request) 
        (
        let data, let response, let error) in

        guard let _:NSData = data, let _:NSURLResponse = response  where error == nil else 

            return
        

        var image = UIImage(data: data!)

        if (image != nil)
        
            func set_image()
            
                //self.images_cache[link] = image
                self.imgFinal[link] = image
                imageview.image = image
            
            dispatch_async(dispatch_get_main_queue(), set_image)
        
    
    task.resume()

【讨论】:

以上是关于使用 Alamofire 下载图像并在 UITableViewCell 中显示的主要内容,如果未能解决你的问题,请参考以下文章

Alamofire:图像下载请求问题

使用 alamofire 下载图像 - iOS

尝试使用 Alamofire 下载图像时,NSURLSession/NSURLConnection HTTP 加载失败

使用 alamofire 下载不完整的文件

Alamofire 并从服务器下载图像 [已解决]

如何从服务器下载图像并快速显示淡入淡出动画?