alamofire 请求完成后更新 tableview

Posted

技术标签:

【中文标题】alamofire 请求完成后更新 tableview【英文标题】:updating tableview after alamofire request completes 【发布时间】:2015-12-04 07:17:36 【问题描述】:

我从我的服务器获得了一个 json 块,然后我继续处理到我的托管对象中,完成后我的表格视图被重新加载以显示新内容,除了一个小问题之外,这一切正常。

在处理 json 时,我得到一个图像的 url,我使用 UIImageView 上的扩展名再次使用 alamofire 获取,这会将下载的图像写入磁盘。

问题是图像应该显示在其托管对象的同一表行上,但发生的是整个 json 的处理完成并在保存到磁盘完成之前返回到 tableview,因此图像不会过来。

如何让 tableview 知道每个图像在完成保存后已准备好,以便其相关行可以更新?

扩展 UIImageView

//
// downloads image from supplied url and writes to disk using supplied destination path
//
func imageFromUrl(urlString: String, destinationPath: String) 

    Alamofire.request(.GET, urlString).response  _, _, data, _ in

        // only if we go data
        if let data = data 

            // cast to jpg image
            let imageData = NSData(data: UIImageJPEGRepresentation(UIImage(data: data)!, 1)!)

            // and write to disk
            imageData.writeToFile(destinationPath, atomically: true)
        
    

【问题讨论】:

【参考方案1】:

试试:

func imageFromUrl(urlString: String, destinationPath: String,handleFinishLoad:()->()) 

    Alamofire.request(.GET, urlString).response  _, _, data, _ in

        // only if we go data
        if let data = data 

            // cast to jpg image
            let imageData = NSData(data: UIImageJPEGRepresentation(UIImage(data: data)!, 1)!)

            // and write to disk
            imageData.writeToFile(destinationPath, atomically: true)
            handleFinishLoad()
        
    

在tableviewcell中:

    yourImageView.imageFromUrl(url, destinationPath: path)  () -> () in
        // downloadfinish 
        // update cell ...
    

更新:

//    in class A: DataService
//    i use static function to example. You should create a singleton for DataService and use func : singleton.getData....
    static func getData(handleComplete:(datas:NSArray)->()) // get json data from server
        // data is array with every item is your object with contain urlimage, name... or it 's nsdictionary too
        Alamofire.request(.GET, urlString).response  _, _, data, _ in
            let arrayReturn = NSMutableArray()
            // parse data and add to a array or add every dictionary to array
            handleComplete(arrayReturn)
        
    

//    in class B:  yourViewController (this class contain your tableview)
//    in viewdidload
    override func viewDidLoad() 
        super.viewDidLoad()
        self.getData  (datas) -> () in
            // set data for tableview
            self.tableviewData = datas
            // numberofrow tableview is self.tableviewData.count
            // every cell of tableview have data is every item of self.tableviewData
            self.tableview.reloadData()
        
    

//    in  CellForRowAtIndexpath, create your cell- have uiimageview
//     and setimage for it
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
        // create cell
        cell.imageview.imageFromUrl(url, destinationPath: path)  () -> () in
            // downloadfinish
            // set image for cell.imageview
            // But it not good. You can use SDWebImage lib , set image 's url for uiimageview. it 's so easy
        
        return cell
    

【讨论】:

谢谢,这看起来很有希望,但有一个小问题......让我进一步解释......对不起...... json加载在一个类中,完成后它会回调到另一个类并且正是这第二个类重新加载了 tableview 并且此时它正在从保存的目标路径中获取单元格图像并写入托管对象,因此 alamofire 块不知道它属于哪个单元格,因为它所做的只是下载并保存到磁盘...如果这有意义吗? 好的,我不会尝试向你解释,因为我的英语不好。但我编码,你...等我 谢谢,会试试你的建议。可以说我完全遵循,但会尝试让你知道。谢谢,很快就会返回结果;-)

以上是关于alamofire 请求完成后更新 tableview的主要内容,如果未能解决你的问题,请参考以下文章

在完成之前中止 Alamofire 下载请求

在添加完成块之前触发 Alamofire 网络请求?

Swift 3.0 迁移后的 Alamofire 错误:“调用中的额外参数”(请求方法)

Alamofire completionHandler 更新 ui 仅在函数完成时有效

Swift 搜索栏 - 使用 Alamofire 请求更新表格视图

等待多个 Alamofire 请求完成