如何将数组保存到ios文档目录?

Posted

技术标签:

【中文标题】如何将数组保存到ios文档目录?【英文标题】:how to save array to ios document directory? 【发布时间】:2016-11-22 02:13:01 【问题描述】:

我有自己的数组类型,如何将这个数组保存到 ios 文档目录。这是我的代码

struct Patient 
        var lastName: String?
        var firstName: String?
    
var offpatients = [Patient]()
let patient = Patient(lastName: lastName as String?, firstName: firstName as String?)
offpatients.append(patient)

for p in offpatients 
    print("offline patients \(p)")

【问题讨论】:

你不是第一个在这里问这个问题的人。同一个问题已经被问了几十次了。 此任务的哪一部分您需要帮助?到目前为止,您尝试了什么? 我在数组中有患者的信息 json 文件并将该数组保存到文档目录,然后我从该目录中读取它 @NeoTeo 试试我发布的答案。 【参考方案1】:

我们不能直接将结构对象保存到NSArray,我们甚至不能使用任何结构数组来保存在文档目录中。所以我们需要一些转换。

首先决定存储在文档目录中的路径。在这个函数中,我们将传递要存储在文档目录中的数组文件的名称

func getFilePath(fileName:String) -> String 
    let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as String
    let url = NSURL(fileURLWithPath: path)
    let filePath = url.appendingPathComponent(fileName)?.path
    return filePath!

主进程从这里开始。现在我们将在这个函数中传递结构体的Patient数组,它将转换为NSMutableArray并保存在DocumentDirectory中。

func convertAndSaveInDDPath (array:[Patient]) 
    let objCArray = NSMutableArray()
    for obj in array 

        // we have to do something like this as we can't store struct objects directly in NSMutableArray
        let dict = NSDictionary(objects: [obj.firstName ?? "",obj.lastName ?? ""], forKeys: ["firstName" as NSCopying,"lastName" as NSCopying])
        objCArray.add(dict)
    

    // this line will save the array in document directory path.
    objCArray.write(toFile: getFilePath(fileName: "patientsArray"), atomically: true)

所以,在保存过程中调用这个方法。

convertAndSaveInDDPath(array: offpatients)

为了查看物理文件,只需打印getFilePath(fileName: "patientsArray") 的结果。它会根据您的系统设置打印类似这样的内容。

/Users/rajan/Library/Developer/CoreSimulator/Devices/B8BD5017-4BD0-47F7-B840-BE9464817392/data/Containers/Data/Application/D09FFC21-D215-44C3-831B-95A470C41A47/Documents/patientsArray

导航到您生成的路径,您会发现 patientArray 文件保存在文档目录位置。

现在为了以相同的形式取回它(swift array of struct

func getArray() -> [Patient]? 
    var patientsArray = [Patient]()
    if let _ = FileManager.default.contents(atPath: getFilePath(fileName: "patientsArray")) 
        let array = NSArray(contentsOfFile: getFilePath(fileName: "patientsArray"))
        for (_,patientObj) in array!.enumerated() 
            let patientDict = patientObj as! NSDictionary
            let patient = Patient(lastName: patientDict.value(forKey: "lastName") as? String, firstName: patientDict.value(forKey: "firstName") as? String)
            patientsArray.append(patient)

        
        return patientsArray
    
    return nil

只需调用此函数,您将保存的数组以相同的 swift 结构体数组返回。

let patientRetrievedArray = getArray()

你就完成了。

希望这会有所帮助!

【讨论】:

【参考方案2】:

这对你有用。

使用SwiftyJSON 框架。 NSFileHande 将是您应该从可以读取和写入文件的地方学习的东西

let array = ["A", "B", "C"]
let json = JSON(array)
let storage = json.description
let data = storage.dataUsingEncoding(NSUTF8StringEncoding)!
if let file = NSFileHandle(forWritingAtPath:path) 
    file.writeData(data)
 

【讨论】:

这将如何工作?问题是关于一组自定义结构。 字典可以添加到数组中,可以序列化后写入文档目录 什么词典?没有字典。 让患者 = Patient(lastName: lastName as String?, firstName: firstName as String?) 或 [string: String] 字典 @gurmandeep 我猜这不是您在答案中处理的简单数组。它是一个 struct 的自定义对象数组,纯粹是 swift。【参考方案3】:

您不能将自定义对象直接保存到文件中。您需要将自己限制为 JSON 支持的类型或“属性列表对象”。

假设您将每个 Patient 对象转换为 [String: String] 类型的字典。

一旦你有一个[String: String] 字典数组,你可以使用NSJSONSerialization 将它保存到一个JSON 文件,或者使用Array 方法write(to:atomically:) 将它保存为一个plist。

编辑:

这样的事情可以将 Patient 对象转换为字典:

func patientToDict(patient: Patient) -> [String: [String: String]] 
    return ["Patient": ["lastName": patient.lastName, 
      "firstName": patient.firstName]]

然后您需要一个相应的 patientFromDict 函数,该函数接受一个 Dictionary 对象并返回一个 Patient 对象

您可以编写一个 map 语句,将整个 Patient 对象数组转换为字典数组,反之亦然。

【讨论】:

如何将我的 offpatients 数组转换为 [String: String] json? let convert = offpatients as [String: String] 这是对的吗?

以上是关于如何将数组保存到ios文档目录?的主要内容,如果未能解决你的问题,请参考以下文章

Swift - 视频文件数组可以很好地保存到应用程序库,但不能正确保存到应用程序文档目录

如何将自定义数组保存/重新加载到 plist

如何将 UIImage 保存到文档目录?

如何将视频文件保存到文档目录

如何将文档文件保存到 iOS 中的 SQLite 数据库,以便稍后在程序中查看它们?

如何将 UIPickerViewController 中的图像或视频保存到文档目录?