Ai đó có thể cho một ví dụ về cách sử dụng NSCache
để lưu vào bộ nhớ cache một chuỗi không? Hoặc bất cứ ai có một liên kết đến một lời giải thích tốt? Tôi dường như không thể tìm thấy bất kỳ ..
Ai đó có thể cho một ví dụ về cách sử dụng NSCache
để lưu vào bộ nhớ cache một chuỗi không? Hoặc bất cứ ai có một liên kết đến một lời giải thích tốt? Tôi dường như không thể tìm thấy bất kỳ ..
Câu trả lời:
Bạn sử dụng nó giống như cách bạn sẽ sử dụng NSMutableDictionary
. Sự khác biệt là khi NSCache
phát hiện áp lực bộ nhớ quá mức (tức là bộ nhớ đệm quá nhiều giá trị), nó sẽ giải phóng một số giá trị đó để nhường chỗ.
Nếu bạn có thể tạo lại các giá trị đó trong thời gian chạy (bằng cách tải xuống từ Internet, bằng cách tính toán, bất cứ điều gì) thì NSCache
có thể phù hợp với nhu cầu của bạn. Nếu dữ liệu không thể được tạo lại (ví dụ: đó là đầu vào của người dùng, nó nhạy cảm với thời gian, v.v.) thì bạn không nên lưu trữ nó trong một NSCache
vì nó sẽ bị hủy ở đó.
Ví dụ, không tính đến an toàn luồng:
// Your cache should have a lifetime beyond the method or handful of methods
// that use it. For example, you could make it a field of your application
// delegate, or of your view controller, or something like that. Up to you.
NSCache *myCache = ...;
NSAssert(myCache != nil, @"cache object is missing");
// Try to get the existing object out of the cache, if it's there.
Widget *myWidget = [myCache objectForKey: @"Important Widget"];
if (!myWidget) {
// It's not in the cache yet, or has been removed. We have to
// create it. Presumably, creation is an expensive operation,
// which is why we cache the results. If creation is cheap, we
// probably don't need to bother caching it. That's a design
// decision you'll have to make yourself.
myWidget = [[[Widget alloc] initExpensively] autorelease];
// Put it in the cache. It will stay there as long as the OS
// has room for it. It may be removed at any time, however,
// at which point we'll have to create it again on next use.
[myCache setObject: myWidget forKey: @"Important Widget"];
}
// myWidget should exist now either way. Use it here.
if (myWidget) {
[myWidget runOrWhatever];
}
applicationDidEnterBackground
)
NSCache
đối tượng không được phân bổ, thì có, nó sẽ vẫn còn trong bộ nhớ. Tuy nhiên, nội dung của nó vẫn có thể bị kiểm duyệt.
@implementation ViewController
{
NSCache *imagesCache;
}
- (void)viewDidLoad
{
imagesCache = [[NSCache alloc] init];
}
// How to save and retrieve NSData into NSCache
NSData *imageData = [imagesCache objectForKey:@"KEY"];
[imagesCache setObject:imageData forKey:@"KEY"];
Mã mẫu để lưu vào bộ nhớ đệm một chuỗi bằng NSCache trong Swift:
var cache = NSCache()
cache.setObject("String for key 1", forKey: "Key1")
var result = cache.objectForKey("Key1") as String
println(result) // Prints "String for key 1"
Để tạo một phiên bản NSCache (một singleton) trên toàn ứng dụng, bạn có thể dễ dàng mở rộng NSCache để thêm thuộc tính sharedInstance. Chỉ cần đặt mã sau vào một tệp có tên như NSCache + Singleton.swift:
import Foundation
extension NSCache {
class var sharedInstance : NSCache {
struct Static {
static let instance : NSCache = NSCache()
}
return Static.instance
}
}
Sau đó, bạn có thể sử dụng bộ nhớ cache ở bất kỳ đâu trong ứng dụng:
NSCache.sharedInstance.setObject("String for key 2", forKey: "Key2")
var result2 = NSCache.sharedInstance.objectForKey("Key2") as String
println(result2) // Prints "String for key 2"
class Cache: NSCache<AnyObject, AnyObject> { static let shared = NSCache<AnyObject, AnyObject>() private override init() { super.init() } }
dự án mẫu Thêm tệp CacheController.h và .m từ dự án mẫu vào dự án của bạn. Trong lớp mà bạn muốn lưu dữ liệu vào bộ nhớ cache, hãy đặt đoạn mã dưới đây.
[[CacheController storeInstance] setCache:@"object" forKey:@"objectforkey" ];
bạn có thể đặt bất kỳ đối tượng nào bằng cách sử dụng cái này
[[CacheController storeInstance] getCacheForKey:@"objectforkey" ];
để lấy lại
Quan trọng: Lớp NSCache kết hợp nhiều chính sách xóa tự động khác nhau. nếu bạn muốn lưu dữ liệu vào bộ nhớ cache vĩnh viễn hoặc bạn muốn xóa dữ liệu đã lưu trong bộ nhớ cache trong một thời gian cụ thể, hãy xem câu trả lời này .
Các đối tượng được lưu trong bộ nhớ cache có nên triển khai giao thức NSDiscardableContent không?
Từ tham chiếu lớp NSCache: Một kiểu dữ liệu phổ biến được lưu trữ trong các đối tượng NSCache là một đối tượng thực hiện giao thức NSDiscardableContent. Lưu trữ loại đối tượng này trong bộ đệm có lợi ích, vì nội dung của nó có thể được loại bỏ khi không cần thiết nữa, do đó tiết kiệm bộ nhớ. Theo mặc định, các đối tượng NSDiscardableContent trong bộ đệm sẽ tự động bị xóa khỏi bộ đệm nếu nội dung của chúng bị loại bỏ, mặc dù có thể thay đổi chính sách xóa tự động này. Nếu một đối tượng NSDiscardableContent được đưa vào bộ đệm, bộ đệm sẽ gọi discardContentIfPossible trên nó khi nó bị xóa.