【发布时间】:2020-08-24 19:36:20
【问题描述】:
(见下文)此代码最初是使用 .json 文本文件实现的,但现在我试图将其更改为使用实时 url 实现,我不知道如何将其设为全局变量,因为一旦你切换到 url 它有 URLSession 任务,你必须使用 task.resume() 让它不断更新,但是我不确定我如何能够将可解码的 T 作为 void 函数返回到 catData 数组。请帮忙谢谢!
开始我的新实施:
import UIKit
import SwiftUI
import CoreLocation
let catData: [Cat] = load("https://tmha-backend.herokuapp.com/api/cats/")
func load<T: Decodable>(_ linkname: String) -> T {
let url = URL(string: "https://tmha-backend.herokuapp.com/api/cats/")
guard let requestUrl = url else {fatalError("Couldn't find \(linkname)")}
var request = URLRequest(url: requestUrl)
// Specify HTTP Method to use
request.httpMethod = "GET"
request.setValue("application/json", forHTTPHeaderField: "Accept")
// Send HTTP Request
let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
guard let data = data else { return }
do {
var returnValue: Cat?
let decoder = JSONDecoder()
returnValue = try decoder.decode(Cat.self, from: data)
} catch {
fatalError("Couldn't parse \(linkname) as \(T.self):\n\(error)")
}
}
task.resume()
}
原代码:
import UIKit
import SwiftUI
import CoreLocation
let catData: [Cat] = load("catData.json")
func load<T: Decodable>(_ filename: String) -> T {
let data: Data
guard let file = Bundle.main.url(forResource: filename, withExtension: nil)
else {
fatalError("Couldn't find \(filename) in main bundle.")
}
do {
data = try Data(contentsOf: file)
} catch {
fatalError("Couldn't load \(filename) from main bundle:\n\(error)")
}
do {
let decoder = JSONDecoder()
return try decoder.decode(T.self, from: data)
} catch {
fatalError("Couldn't parse \(filename) as \(T.self):\n\(error)")
}
}
【问题讨论】:
标签: json decode swift5 urlsession jsondecoder