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 发布网络请求的数据

Combine + SwiftUI 中的最佳数据绑定实践?

使用 SwiftUI+Combine 的数据库延迟加载

SwiftUI NSViewRepresentable 无法从@Publisher 读取数据

使用 Combine 和 SwiftUI 在 Realm 中观察收集结果

结合 SwiftUI 远程获取数据 - ObjectBinding 不更新视图