问题描述
我在 here 之前发布了关于此内容的帖子,我根据 this 文章对我的代码进行了一些更改,但现在我的数据甚至无法像以前一样在 .onAppear {…}
中使用.基本上,我无法从 reddit API 中获取数据并将其存储在变量 theUser 中。
这是我的代码,感谢您的时间:)
struct ContentView: View {
@State var didAppear = false
@State var theUser = getNilUser()
var body: some View {
vstack{
Text(theUser.data.subreddit.display_name_prefixed ?? "No name found")
Text(theUser.data.subreddit.public_description ?? "No description found")
}
.onAppear(perform: {
getUser(withName: "markregg")
print(theUser)
})
}
func getUser(withName username: String) {
if !didAppear {
guard let url = URL(string: "https://www.reddit.com/user/\(username)/about.json") else {
print("Whoops")
return
}
URLSession.shared.dataTask(with: url) { data,response,error in
if let data = data {
do {
if let decodedUser = try? JSONDecoder().decode(user.self,from: data) {
dispatchQueue.main.async {
self.theUser = decodedUser
}
return
}
} catch {
print(error)
}
} else if let error = error {
print(error)
} else {
print("Request Failed")
}
}.resume()
didAppear = true
}
}
}
解决方法
我对您的代码进行了一些快速更改(很晚了,抱歉)。一些评论:(1)你应该使用 try 吗? (带问号)您不需要捕获错误(永远不会生成),(2)为什么不使用可选的用户类型?,(3)您设置了“传出连接(客户端)”功能,不是吗?
struct ContentView: View {
@State var didAppear = false
@State var theUser: User? // = getNilUser()
var body: some View {
VStack{
Text("Display name: \(theUser?.data.subreddit.display_name_prefixed ?? "No name found")")
Text("Public description: \(theUser?.data.subreddit.public_description ?? "No description found")")
}
.frame(width:200,height: 200)
.onAppear(perform: {
getUser(withName: "markregg")
})
}
func getUser(withName username: String) {
if !didAppear {
guard let url = URL(string: "https://www.reddit.com/user/\(username)/about.json") else {
print("Whoops")
return
}
URLSession.shared.dataTask(with: url) { data,response,error in
if let data = data {
if let decodedUser = try? JSONDecoder().decode(User.self,from: data) {
DispatchQueue.main.async {
self.theUser = decodedUser
}
return
}
} else if let error = error {
print(error)
} else {
print("Request failed")
}
}.resume()
didAppear = true
}
}
}