Cách sử dụng NSCache


121

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ỳ ..


7
Mặc dù nhìn thấy một lượng lớn Cacao nhưng tôi chưa bao giờ nghe nói về NSCache. Câu hỏi hay!
Nektarios

Tôi đã tạo một phiên bản NSCache có thể lặp lại, tại đây. Vui lòng đóng góp cho nó: github.com/gregkrsak/GKCache
Greg M. Krsak

Câu trả lời:


134

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 NSCachephá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ì NSCachecó 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 NSCachevì 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];
}

1
làm thế nào để khởi tạo đối tượng NSCache? Tôi dường như mất tất cả thông tin được lưu trong bộ nhớ cache mỗi khi tôi chạy ứng dụng. Tôi sử dụng; [[NSCacheosystem] init]
Thizzer

17
Nó không phải là bộ nhớ cache vĩnh viễn trên đĩa. Nó chỉ có trong bộ nhớ, vì vậy có, nó sẽ bị phá hủy mỗi khi ứng dụng của bạn ngừng chạy.
Jonathan Grynspan

Bộ nhớ đệm này có được duy trì khi sau khi ứng dụng vào backgruond không? (tức là sau applicationDidEnterBackground)
barfoon

Nếu ứng dụng không bị kết thúc và 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.
Jonathan Grynspan

3
Không. Một khẳng định khẳng định rằng điều gì đó là đúng, nghĩa là tuyên bố bên trong được mong đợi là đúng. Chúng tôi khẳng định rằng việc gán và / hoặc tạo đối tượng đã thành công.
Jonathan Grynspan

19
@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"];

3
Đúng. Lưu: [imagesDictionary setObject: imageData forKey: @ "KEY"]; truy xuất: NSData * imageData = [imagesCache objectForKey: @ "KEY"];
Gabriel.Massana

2
lưu dữ liệu vào chache: [imagesCache setObject: imageData forKey: @ "KEY"];
kas-kad

1
Tôi vừa sửa bài đã thay đổi: imagesDictionary cho imagesCache. Thx
Gabriel.Massana

Một ví dụ nhanh tương đương?
Jasper

9

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"

3
bạn có biết làm thế nào để thực hiện điều này trong swift 3?
Andy

3
Điều này sẽ hoạt động: class Cache: NSCache<AnyObject, AnyObject> { static let shared = NSCache<AnyObject, AnyObject>() private override init() { super.init() } }
AmitaiB

6

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 .


1

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.


1
Bạn có thể triển khai giao thức NSDiscardableContent nhưng điều này không bắt buộc. Có vẻ như NSDiscardableContent luôn bị xóa khỏi NSCache khi không còn tham chiếu nào nữa. Các đối tượng khác với đối tượng NSDiscardableContent được lưu trữ trong NSCache cho đến khi có 'bộ nhớ bị thắt chặt' và NSCache sẽ bị xóa.
Thizzer
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.