2015-11-08 63 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

相關問題