【发布时间】:2020-10-24 07:41:41
【问题描述】:
我写代码,在 Xcode 中没有错误,但我无法使用 combine 获取数据,为什么?没有结合这个API工作,没有结合)为什么?也许我在某个地方有错误
class ModelView: ObservableObject {
let baseURL = "https://itunes.apple.com/search?term=taylor+swift&entity=song"
private var task: AnyCancellable?
@Published var result = [Result]()
func fetchData() {
guard let url = URL(string: "https://itunes.apple.com/search?term=taylor+swift&entity=song") else {
return
}
task = URLSession.shared.dataTaskPublisher(for: url)
.map{$0.data}
.decode(type: Response.self, decoder: JSONDecoder())
.map{$0.result}
.replaceError(with: [Result]())
.eraseToAnyPublisher()
.receive(on: RunLoop.main)
.assign(to: \ModelView.result, on: self)
}
}
struct ContentView: View {
@ObservedObject var model = ModelView()
var body: some View {
List {
ForEach(model.result, id: \.self) {
i in VStack {
Text(i.trackName)
}
}
}.onAppear {
self.model.fetchData()
}
}
}
【问题讨论】:
-
你的结果和回应是什么?
-
struct Response: Codable { var results: [Result] } struct Result: Codable, Hashable { var trackId: Int var trackName: String var collectionName: String }
-
可能需要 JSONDecoder
-
...在上述代码快照中的一些拼写错误修复了所有工作之后。 Xcode 12 / iOS 14。
-
不,不工作)我写的代码是对的,但不能获取数据