写入本地数据
确定文件夹后,我们创建一个方法将数据写入到本次存储中,如下代码所示:
swift
复制代码
//写入本地数据 func saveItems() { let encoder = PropertyListEncoder() do { let data = try encoder.encode(models) try data.write(to: dataFilePath(), options: Data.WritingOptions.atomic) } catch { print("错误信息: (error.localizedDescription)") } }
上述代码中,我们使用编码器PropertyListEncoder将对象实例与XML数据格式之间进行互相转换,作用是使得原始数据能够在系统中进行传输,传输的数据通过dataFilePath方法进行写入存储中,我们将整个写入存储的操作创建一个方法saveItems。
我们什么时候会使用到将数据写入存储呢?是的,在每次数据发生变化时。因此我们可以在ViewModel视图模型创建的方法中调用saveItems方法,如下图所示:
写入本次存储保存后,我们如果使用到网络请求的方法时,还需要将网络请求回来的数据也写入到本次存储中,以及在页面加载时读取本次存储的内容。
加载本地数据
所以我们还需要创建一个读取本地存储数据的方法,将上一次存起来的数据在下一次打开时加载出来,如下代码所示:
// 加载本地数据 func loadItems() { let path = dataFilePath() // 如果没有数据则跳过 if let data = try? Data(contentsOf: path) { let decoder = PropertyListDecoder() do { models = try decoder.decode([Model].self, from: data) } catch { print("错误提示: (error.localizedDescription)") } } }
上述代码中,我们创建了一个读取本地数据的方法loadItems,在loadItems方法中,我们首先判断数据路径是否存在,如果存在则执行使用编码器PropertyListEncoder传输数据,将符合Model数据模型的数据加载到models数据集中,如果失败则输出打印错误信息。
初始化本地数据
完成后,我们需要在应用初始化时,读取本次数据的方法,如下代码所示:
init() { loadItems() }
完成后,我们来到ContentView视图,创建一条数据并刷新模拟器预览,无论我们离开此页面还是推出Xcode,数据都会被保存在本地中,在下一次打开时就会看得到上一次创建的数据。