【问题标题】:Storing data in Swift iOS app for later use在 Swift iOS 应用程序中存储数据以备后用
【发布时间】:2015-11-25 06:36:53
【问题描述】:

我正在用 Swift 编写一个 iOS 应用程序,该应用程序从多个应用程序屏幕收集用户输入,在最后一个屏幕中,它应该通过 API 将收集到的信息发布到服务器。

现在我的问题是,管理应用中收集的数据的最佳方式是什么?我应该使用 plist 来保存我的表单数据吗?它还有一张我想从最终屏幕上传到我的服务器的图像。我该怎么办?

PS:我也读过http://developer.apple.com/CoreData,但我不确定这是否是正确的前进方式。

非常感谢任何建议。

【问题讨论】:

  • 使用 NSUserDfault。您可以将图像转换为数据,因为 NSUserDfault 仅支持序列化对象,如字符串、nsnumbers、nsdata、nsdate 等。
  • 最好还是保存在磁盘上,使用文档目录。如果确保包含的所有对象都符合NSCoding,则可以将阵列直接保存到磁盘。把它放在NSUserDefaults 不是一个好主意,它是用于小设置数据的。不是图片。
  • @rckoenes 保存到磁盘,如我创建 xml 或 json 文件(用于保存变量)和 png/jpeg 用于保存图像?
  • 您也可以将洞NSArray 保存到磁盘。阅读Archives and Serializations Programming Guide
  • 我做了类似的事情,我只是做了一个txt文件并保存在文档中。 CoreData 和 NSUserDefaults 对于这类事情来说太硬核了

标签: ios swift persistent-storage


【解决方案1】:

更新:为了节省您的时间 - 这是 Swift 1.2 解决方案。我没有在 Swift 2 上测试它(可能需要更新 secureValue 流)

看起来你在谈论用户的详细信息/个人资料(如果我错了,请纠正我),对于这么多的数据 - 使用 NSUserDefault 是完全可以的。

对于用户偏好(如果是这样的话!!)我会使用偏好管理器之类的东西:

import Foundation
import Security

class PreferencesManager {

    class  func saveValue(value: AnyObject?, key: String) {

        NSUserDefaults.standardUserDefaults().setObject(value, forKey: key)
        NSUserDefaults.standardUserDefaults().synchronize()

    }
    class  func loadValueForKey(key: String) -> AnyObject? {
        let r : AnyObject? = NSUserDefaults.standardUserDefaults().objectForKey(key)
        return r

    }

    class  func saveSecureValue(value: String?, key: String) {
        var dict = dictForKey(key)
        if let v = value {
            var data: NSData = v.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!
            (SecItemDelete(dict as NSDictionary as CFDictionary))
            dict[kSecValueData as NSString] = v.dataUsingEncoding(NSUTF8StringEncoding,
                allowLossyConversion:false);
            var status = SecItemAdd(dict as NSDictionary as CFDictionary, nil)
        } else {
            var status = SecItemDelete(dict as NSDictionary as CFDictionary)
        }
    }

    class  func loadSecureValueForKey(key: String) -> String? {
        var dict = dictForKey(key)
        dict[kSecReturnData as NSString] = kCFBooleanTrue
        var dataRef: Unmanaged<AnyObject>?
        var value: NSString? = nil
        var status = SecItemCopyMatching(dict as NSDictionary as CFDictionary, &dataRef)
        if 0 == status {
            let opaque = dataRef?.toOpaque()
            if let op = opaque {
                value = NSString(data: Unmanaged<NSData>.fromOpaque(op).takeUnretainedValue(),
                    encoding: NSUTF8StringEncoding)
            }
        }

        let val :String? =  value as? String
        return val
    }

    class private func dictForKey(key: String) -> NSMutableDictionary {
        var dict = NSMutableDictionary()
        dict[kSecClass as NSString] = kSecClassGenericPassword as NSString
        dict[kSecAttrService as NSString] = key
        return dict
    }

}

你可以使用 PreferencesManager.saveSecureValue 用于安全数据(如密码等)和 PreferencesManager.saveValue 其余值

【讨论】:

  • 它类似于用户配置文件,但它更像是一个应用程序,每天创建 100 个配置文件。它不仅仅是一个用户个人资料信息。
  • 我只想将数据存储在设备上,直到进行最终的 API 调用。一旦完成,我就不再需要这些数据了。
  • 不,那么情况并非如此:然后我会写入 Documents 文件夹中的文件。如果是 NSDictionary - 只需 writeToFile,这里还有一些好的建议:stackoverflow.com/questions/27197658/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-24
  • 1970-01-01
  • 1970-01-01
  • 2013-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多