如何解决json解码的存储结果突然消失/在WatchOS中观察到的对象不响应
我将iPhone的json数据解码到手表,然后将其存储到一个声明为@ObservableObject的对象(自定义类:PeopleObj)中。但是,包含此对象的contenview无法获取数据
这是数据模型:
struct Person: Codable {
var pid : UUID
var dept: String
var name: String
init(pid: UUID,dept: String,name: String){
self.pid = pid
self.dept = dept
self.name = name
}
}
class PeopleObj: ObservableObject,Identifiable,Codable{
@Published var people: [Person] = []
// get codable
init() { }
enum CodingKeys: CodingKey {
case people
}
func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(people,forKey: .people)
}
required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
people = try container.decode(Array.self,forKey: .people)
}
}
以下是WatchOS的解码部分,在这里,我将json数据作为对请求的答复,并将其解码为peopleObj:
let jsonEncoder = JSONEncoder()
do {
let jsonDataRequest = try jsonEncoder.encode(request)
print("send request")
self.session?.sendMessageData(jsonDataRequest,replyHandler: { response in
print(">>>>>>>>>>>>>>>>> DATA-Reply vom iPhone received: \(response)")
DispatchQueue.main.async {
let jsonDecoder = JSONDecoder()
do {
self.peopleObj = try jsonDecoder.decode(PeopleObj.self,from: response)
for person in self.peopleObj.people {
print("received person: \(person.name),dept \(person.dept)")
// here it prints correctly
}
} // End do decode
catch { print("decode catch!!!!!!!") }
} // Dispatch main
},errorHandler: { error in
print("Error sending message: %@",error)
}) // sendMessageData
} // End do decode
catch { print("encode catch!!!!!!!") }
这是contenview,观察对象:
struct ContentView: View {
@ObservedObject var peopleObj: PeopleObj
var body: some View {
VStack {
List(peopleObj.people,id: \.pid) { person in
HStack {
Text("name: \(person.name)")
Spacer()
Text("dept: \(person.dept)")
}
}
}
}
}
我尝试将json解码为结构,然后将值手动添加到peopleObj-可以,但是对我来说似乎不是正确的过程!我无法解释原因,猜测它与值与引用有关。
任何帮助和/或想法都非常受欢迎!!!!
编辑:peopleObj在HostingController中定义:
class HostingController: WKHostingController<ContentView>,WCSessionDelegate{
@ObservedObject var peopleObj:PeopleObj = PeopleObj()
从HostingController调用ContentView
override var body: ContentView {
return ContentView(peopleObj: peopleObj)
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。