【问题标题】:How to save parsed JSON data temporarily?如何临时保存解析的 JSON 数据?
【发布时间】:2015-08-24 01:51:50
【问题描述】:

目前,在我的应用程序中,我成功地对 Web API 进行 POST 调用,并从 JSON 获取访问令牌及其到期时间。

现在我想保存访问令牌,它是我正在解析的 JSON 中的对象之一。但是,我想暂时保存它。这意味着,用户需要重新登录以获取另一个访问令牌才能使用该应用程序。

我已阅读有关核心数据的材料,但它们都使用永久存储。我也看过Locksmith,但我认为这也不是临时存储。

请帮忙!有什么方法可用?

这是我正在使用的解析后的 JSON,我需要下面显示的访问令牌:

 var json = NSJSONSerialization.JSONObjectWithData(data, options: .MutableContainers, error: &err) as? NSDictionary

 if let parseJSON = json {
      var token = parseJSON["access_token"] as? String
      println("token: \(token)")
 }

【问题讨论】:

  • 临时是主观的。您可以将它写入任何存储,无论是 CoreData 还是 NSUserDefaults,并命名它以便您的应用程序逻辑理解它是“临时的”。
  • 你的意思是缓存在内存中而不是磁盘中?
  • 如果内存不够临时,请将其归档到NSCacheDirectory

标签: json swift storage


【解决方案1】:

在我看来,您似乎只想在应用程序运行时存储此访问令牌。如果应用程序已关闭,那么您希望您的用户重新登录,从而获得一个新令牌?如果是这种情况,那么我会简单地使用一个变量来存储它,例如在 UserManager 单例类中,或者如果您愿意,也可以在您的应用委托中。

如果您想将此变量存储更长时间,例如如果即使应用程序已关闭,您也想存储它,那么我会使用 NSUserDefaults 来存储它。将它存储在 userDefaults 中的唯一问题是它不是很安全,因为这是一个任何人都可以读取的 plist。因此,出于这个原因,我不建议将其存储为字符串,而是将其存储为数据。

let defaults = NSUserDefaults.standardUserDefaults() 
if token != nil {
    let tokenData = token!.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
    defaults.setObject(tokenData, forKey: "accessToken")
}

随意将密钥“accessToken”更改为任何其他内容,甚至是随机的数字和数字字符串,因为这样您将通过混淆获得一些安全性。要从 NSUserDefaults 中检索访问令牌,请使用以下代码:

let defaults = NSUserDefaults.standardUserDefaults()
var token: String?
if let tokenData = defaults.objectForKey("accessToken") as? NSData {
    token = NSString(data: tokenData, encoding: NSUTF8StringEncoding) as? String
}

使用这些技术,您可以继续创建一个可以为您完成所有这些工作的属性,这将使其使用起来更加方便:

//MARK: Variables 
private var tokenKey = "asdfa4tet4qtqERfasfQW$Rwrwe" //Random characters to hide the key.

//MARK: Properties
var Token: String? {

    get {
        let defaults = NSUserDefaults.standardUserDefaults()
        var token: String?
        if let tokenData = defaults.objectForKey(self.tokenKey) as? NSData {
            token = NSString(data: tokenData, encoding: NSUTF8StringEncoding) as? String
        }
        return token
    }
    set(token)  {

        let defaults = NSUserDefaults.standardUserDefaults()
        if token != nil {
            var tokenData = token!.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
            defaults.setObject(tokenData, forKey: self.tokenKey)
        } else {
            defaults.setObject(nil, forKey: self.tokenKey)
        }  
    } 

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-28
    • 1970-01-01
    • 1970-01-01
    • 2012-07-25
    • 2013-02-22
    • 1970-01-01
    相关资源
    最近更新 更多