Tôi đã cố gắng triển khai một singleton được sử dụng làm bộ nhớ cache cho ảnh mà tôi đã tải lên ứng dụng iOS của mình từ web. Tôi đã đính kèm ba biến thể trong mã bên dưới. Tôi đã cố gắng để có được biến thể 2 làm việc nhưng nó gây ra một lỗi biên dịch mà tôi không hiểu và muốn được giúp đỡ về những gì tôi đang làm sai. Biến thể 1 làm bộ nhớ đệm nhưng tôi không thích việc sử dụng một biến toàn cục. Biến thể 3 không làm bộ nhớ đệm thực tế và tôi tin rằng đó là bởi vì tôi đang nhận được một bản sao trong nhiệm vụ để var ic = ...., đó là chính xác?Singleton in Swift
Mọi phản hồi và thông tin chi tiết sẽ được đánh giá cao.
Cảm ơn, Zvi
import UIKit
private var imageCache: [String: UIImage?] = [String : UIImage?]()
class ImageCache {
class var imageCache: [String : UIImage?] {
struct Static {
static var instance: [String : UIImage?]?
static var token: dispatch_once_t = 0
}
dispatch_once(&Static.token) {
Static.instance = [String : UIImage?]()
}
return Static.instance!
}
}
class ViewController: UIViewController {
@IBOutlet weak var imageView: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
imageView.image = UIImage(data: NSData(contentsOfURL: NSURL(string: "http://images.apple.com/v/iphone-5s/gallery/a/images/download/photo_1.jpg")!)!)
//variant 1 - this code is working
imageCache["photo_1"] = imageView.image
NSLog(imageCache["photo_1"] == nil ? "no good" : "cached")
//variant 2 - causing a compiler error on next line: '@lvalue $T7' is not identical to '(String, UIImage?)'
//ImageCache.imageCache["photo_1"] = imageView.image
//NSLog(ImageCache.imageCache["photo_1"] == nil ? "no good" : "cached")
//variant 3 - not doing the caching
//var ic = ImageCache.imageCache
//ic["photo_1)"] = imageView.image
//NSLog(ImageCache.imageCache["photo_1"] == nil ? "no good" : "cached")
}
}
Tại sao bạn đang sử dụng '[String:? UIImage]' thay vì '[Chuỗi : UIImage] '? Tôi nghĩ đó có thể là nguồn gốc của rắc rối bạn đang gặp phải. –
Lưu ý rằng bạn không cần phải sử dụng 'dispatch_once' - đọc [ở đây] (http://stackoverflow.com/a/26376288/148357) – Antonio
chỉ FTR, DLImageLoader là một thư viện bộ nhớ đệm đáng kinh ngạc, và bây giờ là trong Swift. nó vô giá ... – Fattie