swiftui combine 无法获取数据 [关闭]
Posted
技术标签:
【中文标题】swiftui combine 无法获取数据 [关闭]【英文标题】:swiftui combine can't fetch data [closed] 【发布时间】: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。 不,不工作)我写的代码是对的,但不能获取数据 【参考方案1】:我试过你的代码,它似乎工作正常。但我在你的代码中得到编译时错误,在这一行中
.map$0.result
我想知道你怎么做不到。我不得不将此行更改为
.map$0.results
这是我尝试过且运行良好的完整代码。
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.results
.replaceError(with: [Result]())
.eraseToAnyPublisher()
.receive(on: RunLoop.main)
.assign(to: \ModelView.result, on: self)
struct Response: Codable
var results: [Result]
struct Result: Codable, Hashable
var trackId: Int
var trackName: String
var collectionName: String
并确保您在 plist 中添加了此密钥
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
希望这会有所帮助
【讨论】:
以上是关于swiftui combine 无法获取数据 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Combine 框架和 SwiftUI 发布网络请求的数据
SwiftUI NSViewRepresentable 无法从@Publisher 读取数据