2016-11-09 16 views
1

私はSwift3プログラミングには新しく、Swift 2.2から既存のアプリケーションをSwift 3にリファクタリングしようとしています。Alamofireに新しいライブラリAlamofireImageがあります。SwampのAlamofireImageへのリファクタリング3

このライブラリにはimageCacheがあり、現在のimageCacheコードをリファクタリングして使用する必要があるかどうかを検討しています。私の質問は、現在の実装よりも大きな利点や効率があるかどうかです。このコードを改善するための他の提案も高く評価されます。

let imageCache = AutoPurgingImageCache()は、はるかに簡単で読みやすい実装のようです。

ここに現在のimageCacheがあります。

class ShoppingManager { 
    static let sharedManager = ShoppingManager() 
    let imageCache = NSCache<AnyObject, AnyObject>() 

画像をロードしてキャッシュする元のSwift 2コードは、ここにあります。

func collectionView(_ collectionView: UICollectionView, cellForItemAtIndexPath indexPath: IndexPath) -> UICollectionViewCell { 

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellIdentifier, for: indexPath) as! ProductsCollectionViewCell 

    // Configure the cell 
    cell.lblProduct.text = "" 
    cell.backgroundColor = UIColor.white 
    cell.imgProduct.image = nil 

    //load Cell Image 

    let shopItem = shopItems[indexPath.row] 
    cell.alamoFireRequest?.cancel() 

    if let image = ShoppingManager.sharedManager.imageCache.object(forKey: shopItem.imgUrl! as AnyObject) as? UIImage { 
     cell.imgProduct.image = image 
    } else { 
     cell.alamoFireRequest = Alamofire.request(.GET, shopItem.imgUrl!).response(completionHandler: { (_, _, data: Data?, error: NSError?) -> Void in 
      if error == nil && data != nil { 
       let img = UIImage(data: data!) 
       cell.imgProduct.image = img 
       ShoppingManager.sharedManager.imageCache.setObject(img!, forKey: shopItem.imgUrl!) 
      } 
     }) 
    } 
return cell 

} 

ここにリファクタリングしたSwift3コードを示します。

func collectionView(_ collectionView: UICollectionView, cellForItemAtIndexPath indexPath: IndexPath) -> UICollectionViewCell { 

     let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellIdentifier, for: indexPath) as! ProductsCollectionViewCell 

     // Configure the cell 
     cell.lblProduct.text = "" 
     cell.backgroundColor = UIColor.white 
     cell.imgProduct.image = nil 

     //load Cell Image 

     let shopItem = shopItems[indexPath.row] 
     cell.alamoFireRequest?.cancel() 

    if let image = ShoppingManager.sharedManager.imageCache.object(forKey: shopItem.imgUrl! as AnyObject) as? UIImage { 
     cell.imgProduct.image = image 
    } else { 
     cell.alamoFireRequest = Alamofire.request(shopItem.imgUrl!).responseImage { response in 
      guard let img = response.result.value else { 
      // Handle error 
      return 
     } 
      cell.imgProduct.image = img 
      ShoppingManager.sharedManager.imageCache.setObject(img, forKey: shopItem.imgUrl! as AnyObject) 
     }    
    } 

    return cell 

    } 

答えて

2

は、あなたが彼らのサンプルコードを確認しませんでした。サンプルコード1として

、それは非常に簡単です:

imageView.af_setImage(
      withURL: URL(string: URLString)!, 
      placeholderImage: placeholderImage, 
      filter: AspectScaledToFillSizeWithRoundedCornersFilter(size: size, radius: 20.0), 
      imageTransition: .crossDissolve(0.2) 
) 


imageView.af_cancelImageRequest() 

はリファレンス:https://github.com/Alamofire/AlamofireImage/blob/master/Example/ImageCell.swift

またはチェックアウトAlamofireImageView:​​

public func af_setImage

このメソッドはキャッシュをサポートしています。

+0

はい、ありがとうございます。それは簡単だと分かっています。キャッシュは現在NSCacheとして実装されており、キャッシュをAlamofieImageキャッシュに変更する理由があるのか​​どうか疑問に思っています。 – markhorrocks

+0

私が知ったことは、Alamofireに従うべきか、それはラッパーであるか、Alamofire(AFNetworkingに似ています)を使用しないことです。ミキシングの問題は、複雑さとデバッグの問題を引き起こします。 –

関連する問題