Swift NSCache Singleton
Aug 31 2020
Eu quero envolver o NSCache em um Singleton para usar a injeção de dependência no meu código. Isso resultou, infelizmente, na passagem do tipo por um parâmetro de função, e eu ainda preciso de dois mocks para sucesso e falha, pois é uma instância singleton.
Eu acho que pode haver uma maneira melhor, mas todos os comentários são apreciados!
ImageCache e protocolo
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
}
}
Instanciando meu modelo de visualização (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
Respostas
WishIHadThreeGuns Sep 02 2020 at 14:29
Sim, este não é o caminho canônico. Minha solução é não usar Selfe focar no compartilhado.
Isso é:
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
}
}
Então os mocks podem ser alterados:
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
}
}
O que significa um erro “Não é possível encontrar o símbolo” ou “Não é possível resolver o símbolo”?
Christopher Nolan uma vez se arrependeu de ter lido o 'roteiro de Pulp Fiction' de Quentin Tarantino