Swift NSCache Singleton
Aug 31 2020
Kodumda bağımlılık enjeksiyonu kullanmak için NSCache'yi bir Singleton'a sarmak istiyorum. Bu, ne yazık ki, türün bir işlev parametresinden geçirilmesiyle sonuçlandı ve hatta bir singleton örneği olduğu için başarı ve başarısızlık için iki alaya ihtiyacım var.
Sanırım daha iyi bir yol olabilir, ancak her yorum takdir edilir!
ImageCache ve protokol
protocol ImageCacheProtocol {
static var shared: Self { get }
func getCache() -> NSCache<AnyObject, UIImage>
}
final class ImageCache: ImageCacheProtocol {
var cache: NSCache<AnyObject, UIImage> = NSCache<AnyObject, UIImage>()
public static let shared = ImageCache()
private init() {}
func getCache() -> NSCache<AnyObject, UIImage> {
return cache
}
}
MockImageCache ve MockImageCacheFailure
final class MockImageCache: ImageCacheProtocol {
var cache: NSCache<AnyObject, UIImage> = MockNSCache(shouldReturnImage: true)
public static let shared = MockImageCache()
private init() {}
func getCache() -> NSCache<AnyObject, UIImage> {
return cache
}
}
final class MockImageCacheFailure: ImageCacheProtocol {
var cache: NSCache<AnyObject, UIImage> = MockNSCache(shouldReturnImage: false)
public static let shared = MockImageCacheFailure()
private init() {}
func getCache() -> NSCache<AnyObject, UIImage> {
return cache
}
}
Görünüm modelimi örnekleme (snippet)
class ViewModel<U: ImageCacheProtocol> {
private var cache: U.Type
init<T: NetworkManagerProtocol>(networkManager: T, data: DisplayContent, imageCache: U.Type) {
self.networkManager = AnyNetworkManager(manager: networkManager)
cache = imageCache
Yanıtlar
WishIHadThreeGuns Sep 02 2020 at 14:29
Evet, bu kanonik yol değil. Benim çözümüm kullanmamak Selfve bunun yerine paylaşıma odaklanmak.
Yani:
protocol ImageCacheProtocol {
func getCache() -> NSCache<AnyObject, UIImage>
}
final class ImageCache: ImageCacheProtocol {
var cache: NSCache<AnyObject, UIImage> = NSCache<AnyObject, UIImage>()
static var shared = ImageCache()
private init() {}
func getCache() -> NSCache<AnyObject, UIImage> {
return cache
}
}
Daha sonra taklitler değiştirilebilir:
final class MockImageCache: ImageCacheProtocol {
var cache: NSCache<AnyObject, UIImage> = MockNSCache(shouldReturnImage: true)
public static var shared: ImageCacheProtocol! = MockImageCache()
func getCache() -> NSCache<AnyObject, UIImage> {
return cache
}
}
Gene Simmons, KISS Çizgi Romanlarının Potansiyel Olarak "İnsanlığı Yeniden Yaratabileceğini" Söyledi
Tom Girardi Dolandırıcılık Suçlamalarından Yargılanma Yetkisinin Belirlenmesi İçin Duruşmaya Katıldı
Kevin Jonas'ın Kızı Alena, Doğum Günü Fotoğrafında Büyümüş Görünüyor: '9 Yaşında Gerçek Hissetmiyor'