Schneller NSCache Singleton
Aug 31 2020
Ich möchte NSCache in einen Singleton einbinden, um die Abhängigkeitsinjektion in meinem Code zu verwenden. Dies hat leider dazu geführt, dass der Typ einen Funktionsparameter durchläuft, und ich benötige sogar zwei Mocks für Erfolg und Misserfolg, da es sich um eine Singleton-Instanz handelt.
Ich denke, es könnte einen besseren Weg geben, aber Kommentare sind willkommen!
ImageCache und Protokoll
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 & 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
}
}
Instanziieren meines Ansichtsmodells (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
Antworten
WishIHadThreeGuns Sep 02 2020 at 14:29
Ja, das ist nicht der kanonische Weg. Meine Lösung besteht darin, nicht zu verwenden Selfund sich stattdessen auf das Teilen zu konzentrieren.
Das ist:
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
}
}
Dann können die Mocks geändert werden:
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
}
}