Swift NSCache 结构未正确保存

Posted

技术标签:

【中文标题】Swift NSCache 结构未正确保存【英文标题】:Swift NSCache struct not saved properly 【发布时间】:2017-02-21 09:19:55 【问题描述】:

我正在尝试缓存一个结构,这是我的代码:

class UserManager 
   static let sharedInstance : UserManager = UserManager()
   fileprivate let cacheKey = "currentUser" as AnyObject
   var currentUser: User? 
      didSet 
         self.cacheUser()
      
   

  fileprivate func getUserFromCache() -> User?
     let cache = NSCache<AnyObject, AnyObject>()
       // here the user is always nil
     if let user = cache.object(forKey: cacheKey) as? User 
            return user
      
      else  
        return nil 
     
  

  fileprivate func cacheUser() 
     let cache = NSCache<AnyObject, AnyObject>()
     if let user = currentUser
         cache.setObject(user  as AnyObject, forKey: cacheKey)
     
     //Here : print user work fine and user is not nil
     print(cache.object(forKey: cacheKey) as? User)
  

   init() 
      currentUser = getUserFromCache()
   

问题在于,当函数getUserFromCache() 执行完cacheUser 函数后,总是返回nil。

我的代码有什么问题?

【问题讨论】:

【参考方案1】:

每次调用 cacheUser 和 getUser 函数时,您都会创建一个新缓存,您希望拥有一个缓存而不是很多缓存。把它放在顶部的 sharedInstance 之后:

var cache = NSCache<AnyObject, AnyObject>()

并从 cacheUser 和 getUser 函数中删除 let cache = ...。

【讨论】:

这解决了我的部分问题,但是现在当我重新启动应用程序时,现金是空的,我想保存缓存,所以下次应用程序午餐时,他会从缓存中获取用户。 保存和加载是一个不同的问题,但是互联网上有很多教程和 Stack Overflow 上关于快速保存数据的答案。如果您有问题,请试一试并发布另一个问题。 NSUserDefaults 可能是您正在做的最简单的事情。如果您以后需要存储更多信息,您可能需要查看 NSCoding 或 CoreData,但它们更难使用。

以上是关于Swift NSCache 结构未正确保存的主要内容,如果未能解决你的问题,请参考以下文章

iOS开发-NSCache

在 iOS Swift 中没有正确加载 Tableview 数组?

位图文件未按正确的顺序保存在内存中

Swift:集合视图未正确调整以更改大小

Swift - UserDefaults 设置未保存在框架内

Swift:表格单元格未正确设置按钮