构建跨平台任务列表应用:iOS与macOS的数据存储与界面适配
立即解锁
发布时间: 2025-09-12 01:52:41 阅读量: 368 订阅数: 26 AIGC 

# 构建跨平台任务列表应用:iOS 与 macOS 的数据存储与界面适配
## 1. 实现 iOS 任务数据的持久化存储
在开发 iOS 任务列表应用 TahDoodle 时,我们发现当程序退出后,所有数据都会丢失,下次启动应用时又会回到示例数据。为了解决这个问题,我们需要实现任务数据的持久化存储。
### 1.1 确定存储位置
首先,我们需要获取一个可以存储任务数据的本地 URL。这可以通过 `FileManager` 来实现:
```swift
class TaskStore: ObservableObject {
private let fileURL: URL = {
let fileManager = FileManager.default
let documentDirectories = fileManager.urls(for: .documentDirectory,
in: .userDomainMask)
let myDocumentDirectory = documentDirectories.first!
let tasksFileURL = myDocumentDirectory.appendingPathComponent("tasks.json")
print("Tasks file is \(tasksFileURL)")
return tasksFileURL
}()
@Published private(set) var tasks: [Task] = []
// ...
}
```
上述代码中,我们通过 `FileManager` 的 `urls(for:in:)` 方法获取用户文档目录的 URL,然后将 `tasks.json` 路径组件追加到该 URL 上,最终得到存储任务数据的文件 URL。
### 1.2 实现数据存储方法
接下来,我们要实现一个 `saveTasks()` 方法,将任务数据保存到磁盘上:
```swift
class TaskStore: ObservableObject {
// ...
func remove(_ task: Task) {
guard let index = tasks.firstIndex(of: task) else { return }
tasks.remove(at: index)
}
private func saveTasks() {
do {
let encoder = JSONEncoder()
let data = try encoder.encode(tasks)
try data.write(to: fileURL)
print("Saved \(tasks.count) tasks to \(fileURL.path)")
} catch {
print("Could not save tasks. Reason: \(error)")
}
}
}
```
在这个方法中,我们使用 `JSONEncoder` 将任务数组编码为 `Data` 类型,然后将编码后的数据写入到之前确定的文件 URL 中。
### 1.3 让任务类型支持编码和解码
为了让 `JSONEncoder` 能够对 `Task` 类型进行编码,`Task` 类型必须遵循 `Encodable` 协议;同时,为了能将编码后的数据解码回任务数组,`Task` 类型还需要遵循 `Decodable` 协议。Swift 提供了一个组合协议 `Codable`,我们让 `Task` 类型遵循该协议即可:
```swift
struct Task: Equatable, Identifiable, Codable {
// ...
}
```
### 1.4 实现数据加载方法
除了保存数据,我们还需要实现一个 `loadTasks()` 方法,在应用启动时加载之前保存的任务数据:
```swift
class TaskStore: ObservableObject {
// ...
private func saveTasks() {
// ...
}
private func loadTasks() {
do {
let data = try Data(contentsOf: fileURL)
let decoder = JSONDecoder()
tasks = try decoder.decode([Task].self, from: data)
print("Loaded \(tasks.count) tasks from \(fil
```
0
0
复制全文
相关推荐










