【问题标题】:Sync iOS and WatchOS Data with UserDefaults [duplicate]使用 UserDefaults 同步 iOS 和 WatchOS 数据 [重复]
【发布时间】:2022-01-07 01:43:05
【问题描述】:

我不熟悉 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()

【问题讨论】:

    标签: swift watchos userdefaults


    【解决方案1】:

    UserDefaults,顾名思义,用于存储有关用户的少量信息。一个示例是用户选择的应用程序设置。可能是用户名等用户信息。它对可以保存在那里的空间和类有限制。 这是设备上的本地存储。 将您所有的应用程序数据存储在其中并不是这个想法。为此使用 CoreData(这也是本地存储)。

    用于设备之间的同步。我建议使用 iCloud 之类的东西,它可以让苹果生态系统轻松交换数据。

    应该可以帮助您进行设置:

    iOS Data Storage Guidelines

    Designing for Core Data in iCloud

    还有其他选择。例如,Firebase 让您的应用程序与数据库连接起来非常容易。它照顾一切。登录、本地存储管理、同步、存储更新等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-05
      • 2017-04-12
      • 1970-01-01
      • 2013-03-11
      相关资源
      最近更新 更多