我不熟悉UserDefaults,想尝试一下,所以我设置了将所有数据存储在用户默认类中(如图所示(
import Foundation
import Combine
class UserSettings: ObservableObject {
@Published var mon: [UserClass] {
didSet {
UserDefaults.standard.set(mon, forKey: "mon")
}
}
@Published var tue: [UserClass] {
didSet {
UserDefaults.standard.set(tue, forKey: "tue")
}
}
@Published var wed: [UserClass] {
didSet {
UserDefaults.standard.set(wed, forKey: "wed")
}
}
@Published var thu: [UserClass] {
didSet {
UserDefaults.standard.set(thu, forKey: "thu")
}
}
@Published var fri: [UserClass] {
didSet {
UserDefaults.standard.set(fri, forKey: "fri")
}
}
@Published var homeworks: [String] {
didSet {
UserDefaults.standard.set(homeworks, forKey: "homeworks")
}
}
@Published var lastSet: String {
didSet {
UserDefaults.standard.set(lastSet, forKey: "lastSet")
}
}
init() {
self.mon = UserDefaults.standard.object(forKey: "mon") as? [UserClass] ?? []
self.tue = UserDefaults.standard.object(forKey: "tue") as? [UserClass] ?? []
self.wed = UserDefaults.standard.object(forKey: "wed") as? [UserClass] ?? []
self.thu = UserDefaults.standard.object(forKey: "thu") as? [UserClass] ?? []
self.fri = UserDefaults.standard.object(forKey: "fri") as? [UserClass] ?? []
self.homeworks = UserDefaults.standard.object(forKey: "homeworks") as? [String] ?? []
self.lastSet = UserDefaults.standard.object(forKey: "lastSet") as? String ?? ""
print("homeworks (homeworks)")
}
}
struct UserClass: Hashable, Codable {
let start: String
let end: String
let name: String
}
func encodeClass(classes: [UserClass], key: String) {
do {
// Create JSON Encoder
let encoder = JSONEncoder()
// Encode Note
let data = try encoder.encode(classes)
print(data)
// Write/Set Data
UserDefaults.standard.set(data, forKey: key)
} catch {
print("Unable to Encode Array of Notes ((error))")
}
}
func decodeClass(key: String) -> [UserClass] {
var classes: [UserClass] = []
if let data = UserDefaults.standard.data(forKey: key) {
do {
// Create JSON Decoder
let decoder = JSONDecoder()
// Decode Note
classes = try decoder.decode([UserClass].self, from: data)
} catch {
print("Unable to Decode Notes ((error))")
}
}
return classes
}
但当我在iOS应用程序和WatchOS应用程序上读取我的数据时,它们似乎都有一个独立的数据副本,不会相互影响。和中一样,我会在手表上持久保存一个家庭作业字符串数组,但手机版本仍然会显示该数组为空。如何使它们同步为一个?
顺便说一句,在我的ContentViews上,我只使用类似的ObservedObject读取存储的数据
@ObservedObject var userSettings = UserSettings()
UserDefaults用于存储用户的少量信息。用户选择的应用程序设置就是一个例子。可能是用户名之类的用户信息。它对可以保存在那里的空间和类有限制这是设备上的本地存储将您的所有应用程序数据存储在那里是不可行的。为此,请使用CoreData(也是本地存储(。
用于设备之间的同步。我建议使用像iCloud这样的东西,它可以让苹果生态系统更容易地交换数据。
应该帮助你设置的东西:
iOS数据存储指南
iCloud 中核心数据的设计
还有其他选择。例如,Firebase使您的应用程序与数据库连接变得非常容易。它能处理一切。登录、本地存储管理、同步、存储更新等