簡體   English   中英

使用Parse.com和Swift在tableView中異步加載圖片

[英]Async image loading in tableView using Parse.com and swift

我有一個像instagram這樣的應用程序,可以在tableView中顯示照片。 當網絡很慢時,在錯誤的單元格中會重新使用圖像,並且在我快速滾動時,錯誤的單元格中也會重新使用我的下載指示器標簽。

我嘗試使用異步圖像加載,但無法對其進行優化。

這是我的cellForRowAtIndexPath方法:

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

    let cell:WallTableViewCell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as WallTableViewCell

    if indexPath.section == timeLineData.count - 1 {
        println("load more pics")
        loadPost()
    }

    cell.tag = indexPath.row


    // timeLineData is my data array

    if timeLineData.count != 0 {

        let userPost  = timeLineData.objectAtIndex(indexPath.section) as PFObject

        cell.commentButton.tag = indexPath.section

    // check if image is in the cache

     if let imagePostedCache: AnyObject = self.imageCache.objectForKey(userPost.objectId){

        dispatch_async(dispatch_get_main_queue(), {
            if let cellToUpdate = tableView.cellForRowAtIndexPath(indexPath) as? WallTableViewCell {
                cell.imagePosted.image = imagePostedCache as? UIImage
                cell.downloadProgressLabel.hidden = true
            }
        })

    }

        // if it is not in the cache get the image from Parse

    else if  let imagesPost:PFFile = userPost["imageFile"] as? PFFile  {
        cell.imagePosted.image = nil
        cell.downloadProgressLabel.hidden = false



        imagesPost.getDataInBackgroundWithBlock({ (imageData:NSData!, error :NSError!) -> Void in

            if !(error != nil) {

                let image:UIImage = UIImage(data: imageData)!

                // add image to the cache

                self.imageCache.setObject( image , forKey: userPost.objectId)

                // display image in the cell

                dispatch_async(dispatch_get_main_queue(), {
                 if let cellToUpdate = tableView.cellForRowAtIndexPath(indexPath) as? WallTableViewCell {
                        cell.imagePosted.image = image as UIImage
                    }
                })


            }

            else {
                println("error")
            }

            }, progressBlock: { (progressStatus :Int32) -> Void in

               cell.downloadProgressLabel.text = "\(progressStatus) %"

                if progressStatus == 100 {

                    cell.downloadProgressLabel.text = ""
                }
        })

        }

    // Define description

        if cell.tag == indexPath.row {

    cell.brandLabel.text = userPost["photoText"] as? String
        }
    }


    return cell
}

這是我的自定義單元格:

    import UIKit
  import QuartzCore

 class WallTableViewCell: UITableViewCell {



@IBOutlet var downloadProgressLabel: UILabel!

@IBOutlet var commentButton: UIButton!

@IBOutlet var imagePosted: UIImageView!


@IBOutlet var brandLabel: UILabel!


}

WallTableViewCell

import UIKit
import QuartzCore

class WallTableViewCell: UITableViewCell 
{
    var isDownloadingInProgress
    @IBOutlet var downloadProgressLabel: UILabel!
    @IBOutlet var commentButton: UIButton!
    @IBOutlet var imagePosted: UIImageView!
    @IBOutlet var brandLabel: UILabel!

    func updateCellWithUserPost(userPost: PFObject)
    {
        if let imagePostedCache: AnyObject = self.imageCache.objectForKey(userPost.objectId)
        {
            self.imagePosted.image = imagePostedCache as? UIImage
            self.downloadProgressLabel.hidden = true
        }
        else if let imagesPost:PFFile = userPost["imageFile"] as? PFFile  
        {
            self.imagePosted.image = nil
            self.downloadProgressLabel.hidden = false
            isDownloadingInProgress = true

            imagesPost.getDataInBackgroundWithBlock({ (imageData:NSData!, error :NSError!) -> Void in
                isDownloadingInProgress = false
                if !(error != nil) 
                {
                    let image:UIImage = UIImage(data: imageData)!
                    self.imageCache.setObject( image , forKey: userPost.objectId)
                    self.imagePosted.image = image as UIImage
                }
                else 
                {
                    println("Error while downloading image")
                }
            }, progressBlock: { (progressStatus :Int32) -> Void in
                    self.downloadProgressLabel.text = "\(progressStatus) %"
                    if progressStatus == 100 
                    {
                        cell.downloadProgressLabel.text = ""
                    }
            })
        }
    }
}

cellForRowAtIndexPath方法

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
{
    let cell:WallTableViewCell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as WallTableViewCell
    let userPost  = timeLineData.objectAtIndex(indexPath.section) as PFObject
    if (!cell.isDownloadingInProgress)
        cell.updateCellWithUserPost(userPost)

    return cell
}

注意:我不太了解Swift,因為我是純粹的Objective-C程序員。 如果您對答案有任何疑問,請告訴我

嘗試使用SDWebImages。 它將為您的應用程序正確處理圖像。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM