список не загружается в swiftUI после. Обновить - PullRequest
1 голос
/ 12 марта 2020

Я получаю некоторые данные с сервера, используя AlamoFire, запрос в порядке, все модели в порядке, проблема в том, что после завершения запроса моя переменная @State не обновляется.

import SwiftUI
import Combine

struct ViewLaundryHome: View {

    @State var items = LaundryItemCategoryViewModel()

    var body: some View {
        VStack {
            Text(items.items.count.description) // returns 0 and never updates
        }
    }
}

class LaundryItemCategoryViewModel: ObservableObject {

    var didChange = PassthroughSubject<LaundryItemCategoryViewModel, Never>()

    var items = [LaundryItemCategory.Result.Doc]() { didSet { didChange.send(self) } }

    init() {
        productCategoryR {
            let d = try! JSONDecoder().decode(LaundryItemCategory.self, from: $0)
            self.items = (d.result?.docs!)!
            print(self.items.count) // returns 5
        }
    }
}

Я думаю, что я сделал именно так, как это видео на YouTube, но он не работает для меня.

https://www.youtube.com/watch?v=xT4wGOc2jd4&t=17s

Вот моя модель данных:

struct LaundryItemCategory: Codable {
    let result: Result?
    let id: Int?

    enum CodingKeys: String, CodingKey {
        case result = "Result"
        case id = "Id"
    }

    struct Result: Codable {
        let docs: [Doc]?
        let currentPage: Int?
        let pages: Int?
        let limit: Int?
        let total: Int?

        enum CodingKeys: String, CodingKey {
            case docs = "Docs"
            case currentPage = "CurrentPage"
            case pages = "Pages"
            case limit = "Limit"
            case total = "Total"
        }

        struct Doc: Codable, Hashable, Identifiable {
            let id: Int
            let title: String
            let media: String
            let price: Int

            enum CodingKeys: String, CodingKey {
                case id = "Id"
                case title = "Title"
                case media = "Media"
                case price = "Price"
            }
        }
    }
}

После. некоторые копания:

произошло нечто странное. Я добавил другое состояние в приложение и изменил его, используя текстовое поле, в тот момент, когда я изменяю значение нового состояния, первое состояние обновляется: - /

@State var items = LaundryItemCategoryViewModel()

@State var i = ""

var body: some View {
    VStack {
        Text(items.items.count.description)
        TextField("sss", text: $i)
        Text(i)
    }
}

1 Ответ

2 голосов
/ 12 марта 2020

Как я уже сказал, вам нужно сделать элементы в ViewLaundryHome как ObservedObject для получения обновлений. В LaundryItemCategoryViewModel вам нужно опубликовать sh элементы. Вот рабочий код, протестированный в iPhone 11 Pro Max 13.3 и Xcode версии 11.3.1. Дайте мне знать, если это работает.

import SwiftUI
import Combine

struct ViewLaundryHome: View {
    @ObservedObject var items = LaundryItemCategoryViewModel()

    var body: some View {
        VStack {
            Text(items.items.count.description)
        }
    }
}

class LaundryItemCategoryViewModel: ObservableObject {

    // var didChange = PassthroughSubject<LaundryItemCategoryViewModel, Never>() // Not needed

    @Published var items = [LaundryItemCategory.Result.Doc]() // Add Published
    // { didSet { didChange.send(self) } } - Not needed

    init() {
        // Delaying the creation of data to mimic data coming from a webserver
        DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 5.0) {
            let x = LaundryItemCategory.Result.Doc(id: 1, title: "Test", media: "Test", price: 0)
            let y = LaundryItemCategory.Result.Doc(id: 2, title: "Test", media: "Test", price: 0)

            self.items.append(x)
            self.items.append(y)
        }

        print(self.items.count) // returns 5
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...