从 URL 下载 UITableIViewCell 图像

Posted

技术标签:

【中文标题】从 URL 下载 UITableIViewCell 图像【英文标题】:UITableIViewCell image downloading from URL 【发布时间】:2016-03-15 09:06:04 【问题描述】:

我正在使用 alamofire 从 URL 下载图像。 我在点击时获得了图像,但在视图出现时却没有。 如何在视图出现时获取所有图像?这是我用来实现这一目标的代码:

import UIKit
import Alamofire
import SwiftyJSON
import SDWebImage
import Kingfisher

class Paragogoi: UITableViewController 
var data=[FronItem]()   

override func viewDidLoad() 
    super.viewDidLoad()

    Alamofire.request(.GET, "http://gaiaskarpos.com/getCategores.php").validate().responseJSON  response in
        switch response.result 
        case .Success:
            if let value = response.result.value 
            
                let json = JSON(value)

                let list: Array<JSON> = json.arrayValue
                var urls=[String]()

                for element in list
                    let id:String=element["id"].stringValue
                    let name:String=element["name"].stringValue
                    let url:String=element["url"].stringValue
                     self.data.append(FronItem(id:id,name:name,url:url))

                ;
                self.tableView.reloadData() 

            
        case .Failure(let error):
            print(error)
        
    



override func didReceiveMemoryWarning() 
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.


override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 

    return data.count



override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCellWithIdentifier("paragogosCell", forIndexPath: indexPath)

    cell.textLabel?.text = data[indexPath.row].name

    asycloadp(data[indexPath.row].url!, imageView: cell.imageView!)


    return cell


func asycloadp(url:String,imageView:UIImageView)
    let downloadQueue=dispatch_queue_create("myqueue", nil)

    print(url)
    dispatch_async(downloadQueue)
        let imageUrl:NSURL?
        = NSURL(string:url)
        dispatch_async(dispatch_get_main_queue())
        imageView.sd_setImageWithURL(imageUrl)
        

    



我应该添加除此之外的任何内容吗?

【问题讨论】:

【参考方案1】:

因为dispatch_async是异步传输,所以下载图片后需要刷新table view,但是我看到你用的是SDWebImage,那么就不需要函数asycloadp了,换个代码再试试吧。

import UIKit
import Alamofire
import SwiftyJSON
import SDWebImage
import Kingfisher

class Paragogoi: UITableViewController 
    var data=[FronItem]()

    override func viewDidLoad() 
        super.viewDidLoad()

        Alamofire.request(.GET, "http://gaiaskarpos.com/getCategores.php").validate().responseJSON  response in
            switch response.result 
            case .Success:
                if let value = response.result.value 
                    let json = JSON(value)

                    let list: Array<JSON> = json.arrayValue
                    var urls=[String]()

                    for element in list
                        let id:String=element["id"].stringValue
                        let name:String=element["name"].stringValue
                        let url:String=element["url"].stringValue
                        self.data.append(FronItem(id:id,name:name,url:url))

                    ;
                    self.tableView.reloadData()

                
            case .Failure(let error):
                print(error)
            
        

    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    


    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 

        return data.count
    


    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCellWithIdentifier("paragogosCell", forIndexPath: indexPath)

        cell.textLabel?.text = data[indexPath.row].name

        let imageUrl:NSURL? = NSURL(string:url)
        cell.imageView!.sd_setImageWithURL(imageUrl,  completed:(image: UIImage?, error: NSError?, cacheType: SDImageCacheType!, imageURL: NSURL?) in
            if (image != nil) 
                tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: .None)
            
        )

        return cell
    


【讨论】:

是的,我尝试过这种情况,但点击单元格时会获取图像。 @adhslock 我再次更新了代码,这个应该可以工作,我已经测试过了。 @adhslock 不客气,谢谢你接受我的回答 :)【参考方案2】:

从服务器获取所有数据后,只需在主线程中重新加载您的 tableView

dispatch_async(dispatch_get_main_queue()) 
    self.tableView.reloadData()

【讨论】:

我看不到图片 execpt make click on cell

以上是关于从 URL 下载 UITableIViewCell 图像的主要内容,如果未能解决你的问题,请参考以下文章

从 url 下载时如何播放音频?

iOS 从 url 下载 html 文件

如何从 URL 下载图像

从 UrL 下载文本

如何使用 Python 从指向子 URL 的 URL 下载 pdf 文件

从远程 url 从 ios 应用程序下载 PDF