在Swift中动态存储和访问数据的最佳方法

问题描述

我有一个应用程序,每次启动时(在启动屏幕内),都会通过API端点从我的数据库获取当前登录用户数据。

{
"username": "test","email": "test@gmail.com","uid": "5f661ffe1a80160027a6cb0c","isverified": true,"hub": {
    "hubID": "npnDsZegiSL5","isSetup": true,"hubSWVersion": 0.11,"_id": "5f661ffe1a80160027a6cb0d","cameraService": {
        "isSetup": true,"bridgeIP": "192.168.0.12","username": "JesCGSr6HrWoKbKnnNOHSayVKdb1"
    },"servicesSetup": {
        "1": "cameraService","2": "TPLinkPlug"
    }
},"code": "100","message": "Success. User details have been provided"
}

随着用户添加服务/更新值,此数据库结构将不断变化。这是我的问题。可以使用JSONDecoder将大量此类问题解答相同,以使用userData并将值推送到可观察对象,通过创建该对象的实例或仅分配该对象即可在整个应用程序中对其进行访问。提取对象时的值。我已经完成并且当前正在使用的内容

class userData: NSObject,ObservableObject { var userdata = userData.self @Published var uid: String = "" @Published var isverified: Bool = false @Published var username: String = "" @Published var email: String = "" } 对象:

...
@EnvironmentObject var user: userData
print("Successfully got user data. Code: \(code ?? "0"). UID: \(response?["uid"] as! String). Username: \(response?["username"] as! String)")
dispatchQueue.main.async {
user.email = response?["email"] as! String
user.uid = response?["uid"] as! String
user.username = response?["username"] as! String
...

当我在应用中收到上述json时,将值分配给对象的代码

@EnvironmentObject var user: userData
username = self.user.username

然后我可以通过以下位置访问它:

{{ location_map | safe}}

但是这需要硬编码的代码才能从数据库中分配每个值,是否有更好,更动态的方法来将来自我的API的整个json响应(无论有什么值/嵌入的json)分配给一个对象并通过该对象在我的整个应用中访问这些数据值?

谢谢

解决方法

因为您的响应中将有新的键值对,所以我认为您应将响应存储为Dictionary并从该字典中获取所需的值,而不是解析响应并存储单独的变量。 这是一个例子:

    let jsonStr = """
        {\"username\": \"test\",\"email\": \"test@gmail.com\",\"uid\": \"5f661ffe1a80160027a6cb0c\",\"isVerified\": true,\"hub\": {
            \"hubID\": \"npnDsZegiSL5\",\"isSetup\": true,\"hubSWVersion\": 0.11,\"_id\": \"5f661ffe1a80160027a6cb0d\",\"cameraService\": {
                \"isSetup\": true,\"bridgeIP\": \"192.168.0.12\",\"username\": \"JesCGSr6HrWoKbKnnNOHSayVKdb1\"
            },\"servicesSetup\": {
                \"1\": \"cameraService\",\"2\": \"TPLinkPlug\"
            }
        },\"code\": \"100\",\"message\": \"Success. User details have been provided\"
        }
    """
    
    let data = jsonStr.data(using: .utf8)
    
    do {
        // store this variable
        let dict =  try JSONSerialization.jsonObject(with: data!,options: []) as? [String: Any]
        
        for (k,v) in dict! {
            // example access to values
            print("key: \(k),value: \(v)")
        }
        
    } catch {
        print(error.localizedDescription)
    }