2016-08-20 1 views
1

J'ai une vue de collection qui affiche des images, certaines d'entre elles sont mises en cache et correctement récupérées, mais d'autres ne le sont pas. La vue de collection affiche deux cellules au carré par ligne.Mise en cache avec alamofireimages

Je n'arrive pas à comprendre pourquoi parfois les images sont extraites du cache et d'autres fois doivent être téléchargées à nouveau.

ici où je mettre en cache les images:

class DataImage { 

static let sharedManager = DataImage() 

let decoder = ImageDecoder() 
let photoCache = AutoPurgingImageCache(
    memoryCapacity: 100 * 1024 * 1024, 
    preferredMemoryUsageAfterPurge: 60 * 1024 * 1024 
) 


//MARK: - Image Downloading 

func getNetworkImage(urlString: String, completion: (UIImage -> Void)) -> (ImageRequest) { 
    let queue = decoder.queue.underlyingQueue 
    let request = Alamofire.request(.GET, urlString) 
    let imageRequest = ImageRequest(request: request) 
    imageRequest.request.response(
     queue: queue, 
     responseSerializer: Request.imageResponseSerializer(), 
     completionHandler: { response in 
      guard let image = response.result.value else { 
       return 
      } 
      let decodeOperation = self.decodeImage(image) { image in 
       completion(image) 
       self.cacheImage(image, urlString: urlString) 
      } 
      imageRequest.decodeOperation = decodeOperation 
     } 
    ) 
    return imageRequest 
} 

func decodeImage(image: UIImage, completion: (UIImage -> Void)) -> DecodeOperation { 
    let decodeOperation = DecodeOperation(image: image, decoder: self.decoder, completion: completion) 
    self.decoder.queue.addOperation(decodeOperation) 
    return decodeOperation 
} 

//MARK: - Image Caching 

func cacheImage(image: Image, urlString: String) { 
    photoCache.addImage(image, withIdentifier: urlString) 
} 

func cachedImage(urlString: String) -> Image? { 
    print("image: \(photoCache.imageWithIdentifier(urlString))") 
    return photoCache.imageWithIdentifier(urlString) 
} 

}

et voici la classe Cell:

class StoreCell: UICollectionViewCell { 

@IBOutlet weak var title: UILabel! 
@IBOutlet weak var storyImage: UIImageView! 
@IBOutlet weak var subTitle: UILabel! 
@IBOutlet weak var cost: UILabel! 

var imageFilename: String! 
var request: ImageRequest! 
var dataImage = DataImage() 


func configure() { 
    self.layer.cornerRadius = 3.0 
    reset() 
    loadImage() 
} 

func reset() { 
    storyImage.image = nil 
    request?.cancel() 
} 

func loadImage() { 

    let stringURL = "https://........\(imageFilename)" 

    if self.storyImage.image == nil { 
     if let image = dataImage.cachedImage(stringURL) { 

      self.storyImage.image = image 
     } else { 
      request = dataImage.getNetworkImage(stringURL) { image in 
       self.storyImage.image = image 
       self.storyImage.runImageTransition(.CrossDissolve(0.2), withImage: image) 
      } 
     } 
    } 
} 

}

+0

hey, avez-vous réussi à résoudre ce problème? quel était le problème ici? Merci! – user3766930

+0

Non, je ne l'ai pas fait. De toute façon avec Swift 3, la requête imageRequest.request vous donnera une erreur. – Giovanni

Répondre

0

Je vais partager tous les codes ci-dessous.

PREMIER Vous devez mettre à jour ImageRequest classe

import UIKit 
import Alamofire 

class ImageRequest { 

    var decodeOperation: Operation? 
    var request: DataRequest 

    init(request: DataRequest) { 
     self.request = request 
    } 

    func cancel() { 
     decodeOperation?.cancel() 
     request.cancel() 
    } 

} 

DEUXIÈME

import UIKit 
import Alamofire 
import AlamofireImage 

class DataImage { 

    static let sharedManager = DataImage() 
    let decoder = ImageDecoder() 
    let photoCache = AutoPurgingImageCache(
     memoryCapacity: 100 * 1024 * 1024, 
     preferredMemoryUsageAfterPurge: 60 * 1024 * 1024 
    ) 

    //MARK: - Read Data 

    func allPhotos() -> [GlacierScenic] { 
     if !photos.isEmpty { return photos } 
     guard let data = NSArray(contentsOfFile: dataPath()) as? [NSDictionary] else { return photos } 
     for photoInfo in data { 
      let name = photoInfo["name"] as! String 
      let urlString = photoInfo["imageURL"] as! String 
      let glacierScenic = GlacierScenic(name: name, photoURLString: urlString) 
      photos.append(glacierScenic) 
     } 
     return photos 
    } 

    func dataPath() -> String { 
     return Bundle.main.path(forResource: "GlacierScenics", ofType: "plist")! 
    } 

    //MARK: - Image Downloading 

    func getNetworkImage(urlString: String, completion: @escaping ((UIImage) -> Void)) -> (ImageRequest) { 
     let queue = decoder.queue.underlyingQueue 
     let request = Alamofire.request(urlString) 
     let imageRequest = ImageRequest(request: request) 
     imageRequest.request.response(
    queue: queue, 
      responseSerializer: DataRequest.imageResponseSerializer(), 
      completionHandler: { response in 
       guard let image = response.result.value else { 
        return 
       } 
       let decodeOperation = self.decodeImage(image) { image in 
        completion(image) 
        self.cacheImage(image, urlString: urlString) 
       } 
       imageRequest.decodeOperation = decodeOperation 
      } 
     ) 
     return imageRequest 
    } 

    func decodeImage(_ image: UIImage, completion: @escaping ((UIImage) -> Void)) -> DecodeOperation { 
     let decodeOperation = DecodeOperation(image: image, decoder: self.decoder, completion: completion) 
     self.decoder.queue.addOperation(decodeOperation) 
     return decodeOperation 
    } 

    //MARK: - Image Caching 

    func cacheImage(_ image: Image, urlString: String) { 
     photoCache.add(image, withIdentifier: urlString) 
    } 

    func cachedImage(_ urlString: String) -> Image? { 
     return photoCache.image(withIdentifier: urlString) 
    } 

} 

TIERS

Mes détails du fichier pod.

source 'https://github.com/CocoaPods/Specs.git' 
platform :ios, '10.0' 
use_frameworks! 

target 'projetname' do 
    pod 'Alamofire', :git => 'https://github.com/Alamofire/Alamofire.git', :tag => '4.0.0' 
    pod 'AlamofireImage', :git => 'https://github.com/Alamofire/AlamofireImage.git', :tag => '3.1.0' 
end 

post_install do |installer| 
    installer.pods_project.targets.each do |target| 
     target.build_configurations.each do |config| 
      config.build_settings['SWIFT_VERSION'] = '3.0' 
     end 
    end 
end