Swift NSCache Singleton
Aug 31 2020
Tôi muốn bọc NSCache trong Singleton để sử dụng chèn phụ thuộc vào mã của mình. Thật không may, điều này đã dẫn đến việc truyền kiểu thông qua một tham số hàm, và tôi thậm chí cần hai lần mô phỏng thành công và thất bại vì nó là một cá thể singleton.
Tôi nghĩ có thể có một cách tốt hơn, nhưng bất kỳ ý kiến đánh giá cao!
ImageCache và giao thức
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
}
}
Khởi tạo mô hình chế độ xem của tôi (đoạn mã)
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
Trả lời
WishIHadThreeGuns Sep 02 2020 at 14:29
Vâng, đây không phải là cách kinh điển. Giải pháp của tôi là không sử dụng Selfvà thay vào đó tập trung vào chia sẻ.
Đó là:
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
}
}
Sau đó, các chế độ giả có thể được thay đổi:
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
}
}