how to implement lazy loading of images in table view using swift

后端 未结 3 927
刺人心
刺人心 2020-11-29 00:13

I want to use lazy loading concept for my table view using swift. In my table view i am showing multiple cells which contain product images and product name . Please help me

3条回答
  •  悲哀的现实
    2020-11-29 00:30

    Old Solution:

    Since you doesn't show any code.

    Here is the example for you.

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    
        // try to reuse cell
        let cell:CustomCell = tableView.dequeueReusableCellWithIdentifier("DealCell") as CustomCell
    
        // get the deal image
        let currentImage = deals[indexPath.row].imageID
        let unwrappedImage = currentImage
        var image = self.imageCache[unwrappedImage]
        let imageUrl = NSURL(string: "http://staging.api.cheapeat.com.au/deals/\(unwrappedImage)/photo")
    
        // reset reused cell image to placeholder
        cell.dealImage.image = UIImage(named: "placeholder")
    
        // async image
        if image == nil {
    
        let request: NSURLRequest = NSURLRequest(URL: imageUrl!)
    
        NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue(), completionHandler: {(response: NSURLResponse!,data: NSData!,error: NSError!) -> Void in
            if error == nil {
    
                image = UIImage(data: data)
    
                self.imageCache[unwrappedImage] = image
                dispatch_async(dispatch_get_main_queue(), {
                    cell.dealImage.image = image
    
                })
            }
            else {
    
            }
        })
        }
    
        else{
            cell.dealImage.image = image
        }
    
      return cell
    
    }
    

    Follow THIS tutorial for more Info. Hope this will help you.

    New Solution:

    Here is extension for it which is created by my friend Leo Dabus which is really simple to use:

    extension UIImageView {
        func downloadImageFrom(link link:String, contentMode: UIViewContentMode) {
            NSURLSession.sharedSession().dataTaskWithURL( NSURL(string:link)!, completionHandler: {
                (data, response, error) -> Void in
                dispatch_async(dispatch_get_main_queue()) {
                    self.contentMode =  contentMode
                    if let data = data { self.image = UIImage(data: data) }
                }
            }).resume()
        }
    }
    

    Now in your cellForRowAtIndexPath method assign image to cell this way:

    cell.cellImageView.image = UIImage(named: "placeholder")  //set placeholder image first.
    cell.cellImageView.downloadImageFrom(link: imageLinkArray[indexPath.row], contentMode: UIViewContentMode.ScaleAspectFit)  //set your image from link array.
    

    And as Rob suggested into comment here is some useful libraries which you can use:

    1. https://github.com/Alamofire/AlamofireImage
    2. https://github.com/onevcat/Kingfisher
    3. https://github.com/rs/SDWebImage
    4. https://github.com/kean/DFImageManager

提交回复
热议问题