如何使用 setObject Swift 2.0 实现基于时间的 NSCache

How to Implement Time-based NSCache with setObject Swift 2.0

我有一个缓存的 NSDictionary。我需要实现一个带有时间戳的基于时间的 setObject。 NSCache Class 没有 setExpiry。任何帮助将不胜感激。

这是我目前拥有的扩展:

import Foundation

extension NSCache {

class var sharedInstance : NSCache {
    struct Static {
        static let instance : NSCache = NSCache()
    }
    return Static.instance
 }
}

我在 http://nshipster.com/nscache/ 找到了 NSCache Extension。有什么简单的方法可以使用到期时间戳来实现吗?

extension NSCache {
subscript(key: AnyObject) -> AnyObject? {
    get {
        return objectForKey(key)
    }
    set {
        if let value: AnyObject = newValue {
            setObject(value, forKey: key)
        } else {
            removeObjectForKey(key)
        }
    }
 }
}

这是基本方法。

PS:这段代码我没有测试过,是用文本编辑器写的。它可能需要根据您的要求进行一些调整:)

import Foundation

protocol Cacheable: class {
    var expiresAt : NSDate { get set }
}

class CacheableItem : Cacheable {
    var expiresAt = NSDate()
}

extension NSCache {

    subscript(key: AnyObject) -> Cacheable? {
        get {
            if let obj = objectForKey(key) as? Cacheable {
                 var now = NSDate();
                if  now.isGreaterThanDate(obj.expiresAt) {
                    removeObjectForKey(key)
                }
            }

            return objectForKey(key) as? Cacheable
        }
        set {
            if let value = newValue {
                setObject(value, forKey: key)
            } else {
                removeObjectForKey(key)
            }
        }
    }
}

extension NSDate
{
    func isGreaterThanDate(dateToCompare : NSDate) -> Bool
    {
        var isGreater = false

        if self.compare(dateToCompare) == NSComparisonResult.OrderedDescending {
            isGreater = true
        }

        return isGreater
    }
}

基于this Stack Overflow answer.

您还可以使用计时器清空队列:

private let ExpiringCacheObjectKey = "..."
private let ExpiringCacheDefaultTimeout: NSTimeInterval = 60

class ExpiringCache : NSCache {

    /// Add item to queue and manually set timeout
    ///
    /// - parameter obj: Object to be saved
    /// - parameter key: Key of object to be saved
    /// - parameter timeout: In how many seconds should the item be removed

    func setObject(obj: AnyObject, forKey key: AnyObject, timeout: NSTimeInterval) {
        super.setObject(obj, forKey: key)
        NSTimer.scheduledTimerWithTimeInterval(timeout, target: self, selector: "timerExpires:", userInfo: [ExpiringCacheObjectKey : key], repeats: false)
    }

    // Override default `setObject` to use some default timeout interval

    override func setObject(obj: AnyObject, forKey key: AnyObject) {
        setObject(obj, forKey: key, timeout: ExpiringCacheDefaultTimeout)
    }

    // method to remove item from cache

    func timerExpires(timer: NSTimer) {
        removeObjectForKey(timer.userInfo![ExpiringCacheObjectKey] as! String)
    }
}