为什么我的SwiftUI列表未填充所有数据?

时间:2019-12-10 08:42:49

标签: swift list api swiftui

我使用组合方式通过api调用返回数据:

[Animals.Dog(id: nil, name: "Bobby", age: 4), Animals.Dog(id: nil, name: "Cronos", age: 2), Animals.Dog(id: nil, name: "Willy", age: 2), Animals.Dog(id: nil, name: "Rex", age: 8)]
finished

在用动物数组填充“列表”时,仅填充第一项。但是,该相同的第一项所显示的动物数量与它们一样多。在这种情况下,第一个项目被填充4次,而我的列表上看不到其他三只狗。

我的数据隐藏在哪里?

import SwiftUI
import Combine

struct AnimalsView: View {

  @State private var dogs = [Dog]()

  private let networkRequest = NetworkRequest()

  //MARK: - Body
  var body: some View {
    VStack(spacing: 20) {
      TitleView()

      //MARK: Dogs list view
      List(dogs) {
        AnimalCell(name: $0.name,
                   age: $0.age)
      }
      .modifierViewList()
    }
    .onAppear {
      _ = networkRequest.downloadAnimals()
        .sink(receiveCompletion: {
          print($0)
        },receiveValue: { (animal) in
          self.dogs = animal.dogs
          print(animal.dogs)
        })
    }
  }
}

//MARK: Network request
extension NetworkRequest {
  func downloadAnimals() -> AnyPublisher<Animal, Error> {
    URLSession.shared
      .dataTaskPublisher(for: EndPoint.rates.url)
      .receive(on: networkQueue)
      .map(\.data)
      .decode(type: Animal.self, decoder: JSONDecoder())
      .mapError { (error) -> NetworkRequest.Error in
        switch error {
        case is URLError:
          return Error.addressUnreachable(EndPoint.rates.url)
        default:
          return Error.invalidResponse
        }
    }
    .eraseToAnyPublisher()
  }
}

2 个答案:

答案 0 :(得分:3)

如果Animal.Dog符合Identifiable,则所有数据都具有相同的id,即nil。因此,List认为您只有一个不同的Animal.Dog,第一个带有id的{​​{1}}。尝试给他们实际的nil

答案 1 :(得分:0)

[Animals.Dog(id:1,name:“ Bobby”,age:4),Animals.Dog(id:2,name:“ Cronos”,age:2),Animals.Dog(id:3,名称:“ Willy”,年龄:2),Animals.Dog(id:4,名称:“ Rex”,年龄:8)]