2015-11-08 128 views
0

我有一个我缓存的NSDictionary。我需要用timestamp实现一个基于时间的setObject。 NSCache Class没有setExpiry。任何帮助,将不胜感激。如何使用setObject Swift 2.0实现基于时间的NSCache

这是扩展我到目前为止:

import Foundation 

extension NSCache { 

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

我发现NSCache Extensionhttp://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) 
     } 
    } 
} 
} 
+1

有点偏离主题,但如果你想创建你所拥有的在扩展,现在单身,你应该检查出[本文](http://krakendev.io/blog/the-right-way-to-write-a-singleton)。你可以在一行中创建一个单例,像这样:'static let sharedInstace = NSCache()'。 –

+0

我有一个JSON,我需要使用1HR的到期时间戳进行缓存。你认为我的方法是否足够?谢谢.. –

回答

1

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

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) 
    } 
} 
+0

谢谢@Rob - 会试试.. –

+0

嗨@Rob,我收到了一个潜在的错误,你能帮忙吗? [截图](https://www.dropbox.com/s/d9wocj6dzex380j/Screenshot%202015-11-08%2016.09.24.png?dl=0)这是我认为应该是语法removeObjectForKey(timer.userInfo ![ExpiringCacheObjectKey])? –

+0

不要为缓存中的每个键添加计时器,您应该为该键添加到期日期,并在检索对象时检查它。 –

2

这里是基本的方法。

PS:我没有测试过这段代码,我在文本编辑器中编写了它。它可能需要一些调整,根据您的要求:)基于this Stack Overflow answer

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 
    } 
} 

+0

非常感谢!将测试它,看看如何工作..干杯:) –

+0

@TalZion我刚刚编辑的答案,所以代码实际编译。 –

+0

@TalZion我编辑了我的答案。在比较日期时纠正逻辑错误。希望它适合你:) – ProblemSlover

相关问题