Json 立即释放数据
我目前正在为我的应用程序开发一个标题UI元素,我的数据被立即释放时遇到了问题。我一直试图让控制台打印它正在接收的任何数据,但在控制台中我甚至没有看到。我试图实现的是,该应用程序连接到其目标“CDN”,然后获取标题数据。我正在使用PHP执行一个SQL查询,以生成一个数组,然后应用程序将从中获取数据。当运行所述纸条时,生成以下数组Json 立即释放数据,json,swift,swiftui,Json,Swift,Swiftui,我目前正在为我的应用程序开发一个标题UI元素,我的数据被立即释放时遇到了问题。我一直试图让控制台打印它正在接收的任何数据,但在控制台中我甚至没有看到。我试图实现的是,该应用程序连接到其目标“CDN”,然后获取标题数据。我正在使用PHP执行一个SQL查询,以生成一个数组,然后应用程序将从中获取数据。当运行所述纸条时,生成以下数组 {"id":"1","title":"Meet ergoWare","header_image":"https://gba.ergoware.io/cache/conte
{"id":"1","title":"Meet ergoWare","header_image":"https://gba.ergoware.io/cache/content/topstory/ergo_news_01.svg","summary":"GBA's New Ergonomic Portal!"}
惊人的阵列是的,所以下一部分是它将在应用程序中读取和编译,以创建标题卡,但问题是我无法加载数据。我知道我遗漏了一些东西,但是没有编译器为我指明我需要的方向,我就在摸索。这是Swift代码
import SwiftUI
struct Response: Codable {
var results: [Article]
}
struct Article: Codable, Identifiable {
var id: Int
var title: String
var header_image: String
var summary: String
}
struct HeadlineUI: View {
@State var results = [Article]()
var CDNLink: String
var body: some View {
ScrollView(.horizontal) {
HStack(spacing: 20) {
ForEach(results) { result in
CardView(image: result.header_image, summary: result.summary, heading: result.title)
}
.onAppear(perform: { self.loadData() })
}
}
}
func loadData() {
guard let url = URL(string: CDNLink) else {
print("Invalid URL")
return
}
let request = URLRequest(url: url)
URLSession.shared.dataTask(with: request) { data, response, error in
if let data = data {
if let decodedResponse = try? JSONDecoder().decode(Response.self, from: data) {
DispatchQueue.main.async {
self.results = decodedResponse.results
print(self.results)
}
return
}
}
print("Fetch failed: \(error?.localizedDescription ?? "Unknown error")")
}.resume()
}
}
struct HeadlineUI_Previews: PreviewProvider {
static var previews: some View {
HeadlineUI(CDNLink: "https://gba.ergoware.io/cdn?funct=fetchNews")
}
}
因此,它应该连接到“CDN”并读取阵列。然后插入这些信息,对于由id定义的结果的每个索引,应该显示一张卡片,上面有头条新闻图像、文章标题和简短摘要。我开始对斯威夫特感到更舒服了,但是像这样的小打嗝会让我的信心崩溃,哈哈。感谢您提供的任何可教的时刻。我找到了它,请按照以下步骤操作:
{
"results" : [{
"id":1,
"title":"Meet ergoWare",
"header_image":"https://gba.ergoware.io/cache/content/topstory/ergo_news_01.svg",
"summary":"GBA's New Ergonomic Portal!"
}]
}
用这个试试看struct Response: Codable {
var results: [Article]
}
struct Article: Codable, Identifiable {
var id: Int
var title: String
var header_image: String
var summary: String
}
struct HeadlineUI: View {
@State var results = [Article]()
var CDNLink: String
var body: some View {
ScrollView(.horizontal) {
HStack(spacing: 20) {
Text("Response:")
ForEach(results) { result in
Text(result.title)
}
}.onAppear(perform: { self.loadData() })
}
}
func loadData() {
guard let url = URL(string: CDNLink) else {
print("Invalid URL")
return
}
let request = URLRequest(url: url)
URLSession.shared.dataTask(with: request) { data, response, error in
if error != nil {
print("Fetch failed: \(error?.localizedDescription ?? "Unknown error")")
return
} else {
do {
let decodedResponse = try JSONDecoder().decode(Response.self, from: data!)
print(decodedResponse)
self.results = decodedResponse.results
} catch let err {
print("Error parsing: \(err)")
}
}
}.resume()
}
}
改变
试试?JSONDecoder()
到试试!JSONDecoder()
您将看到错误,您发布的JSON是一个对象,而不是一个数组,您的Swift代码期望的是一个具有属性results
@zaitsman条件绑定初始值设定项必须具有可选类型,而不是我得到的错误“Response”。是的,这是一个明显的错误,如果要切换到try,则还必须删除if let={}
,只需删除if语句后的if
和{}
。更改代码如下:```if let data=data{let decodedResponse=try!JSONDecoder().decode(Response.self,from:data)DispatchQueue.main.async{self.results=decodedResponse.results print(self.results)}``所以我试着编译了这个,但我仍然没有在UI或控制台中得到任何填充结果。你能在日志中看到错误吗?你的服务返回了正确的JSON吗?试着使用这个url:我不能,这是我的问题,我的控制台日志中没有任何错误。这段代码对我来说非常有效,请尝试重新启动连接重新启动控制台并确保服务返回代码所期望的JSON的设备,否则JSONDecoder()将失败,并报告