【问题标题】:swiftui combine can't fetch data [closed]swiftui combine 无法获取数据 [关闭]
【发布时间】: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。
  • 不,不工作)我写的代码是对的,但不能获取数据

标签: api swiftui combine


【解决方案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>

希望这会有所帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    • 2018-12-30
    • 1970-01-01
    相关资源
    最近更新 更多