私は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
}
はい、ありがとうございます。それは簡単だと分かっています。キャッシュは現在NSCacheとして実装されており、キャッシュをAlamofieImageキャッシュに変更する理由があるのかどうか疑問に思っています。 – markhorrocks
私が知ったことは、Alamofireに従うべきか、それはラッパーであるか、Alamofire(AFNetworkingに似ています)を使用しないことです。ミキシングの問題は、複雑さとデバッグの問題を引き起こします。 –