我有一个缓存的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/找到了http://nshipster.com/nscache/。有什么简单的方法可以用过期时间戳来实现吗?
extension NSCache {
subscript(key: AnyObject) -> AnyObject? {
get {
return objectForKey(key)
}
set {
if let value: AnyObject = newValue {
setObject(value, forKey: key)
} else {
removeObjectForKey(key)
}
}
}
}发布于 2015-11-08 15:20:05
您还可以使用计时器来清空队列:
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)
}
}发布于 2015-11-08 14:21:58
以下是基本的方法。
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
}
}https://stackoverflow.com/questions/33593827
复制相似问题