ForEach 抱怨 SwiftData 存在重复值

问题描述 投票:0回答:1

我有一个类别模型,其定义如下:

@Model
final class Category {
    @Attribute(.unique) var id: UUID
    var name: String
    var parent_id: UUID //categories can be children of other categories

    init(id: UUID, name: String, parent_id: UUID) {
        self.id = id
        self.name = name
        self.parent_id = parent_id
    }
}

我从 API 调用中获取类别并将其放入我的视图中:

import SwiftUI
import SwiftData

struct CategoryView: View {
    @Environment(\.modelContext) private var modelContext
    
    @Query private var categories: [Category]
    @Query(filter: #Predicate<Category>{ $0.parent_id == nil })
        private var top_level_categories: [Category]
    
    var spacing: CGFloat = 25

    var body: some View {
        HStack() {
            Text("Categories")
                .font(.title.bold())
            
            Spacer()
            Text("see all")
        }
        .padding([.bottom, .top], 0)
        VStack(spacing: 20) {
            ScrollView(.horizontal) {
                HStack(spacing: spacing) {
                    ForEach(top_level_categories) { category in
                        Text(category.name!)

                    }
                }
            }
        }
        .onAppear{
            getCategories()
        }
    }
    
    func getCategories()  {
        get_refresh_token { token in
            guard let token = token else {
                return
            }
            var urlRequest = URLRequest (url: URL(string:"https://api.test.com/categories")!)
            urlRequest.httpMethod = "GET"
            urlRequest.addValue("application/json", forHTTPHeaderField: "Content-Type")
            urlRequest.addValue("Bearer \(token)", forHTTPHeaderField: "Authorization")
            
            URLSession.shared
                .dataTask(with: urlRequest) { (data, response, error) in
                    do {
                        if let data = data {
                            let c = try JSONDecoder().decode([Category].self, from: data)
                            c.forEach { modelContext.insert($0) }
                            try? modelContext.save()
                        }
                    }
                    catch {
                        print(error)
                    }
                }.resume()
            
        }
    }
    
    
}

我第一次运行该应用程序时运行良好,但当我再次运行它时,出现以下错误:

ForEach<Array<Category>, UUID, Text>: the ID XXXXXX-XXXX-XXXX-XXXX-XXXXXX occurs multiple times within the collection, this will give undefined results!

不知道为什么会发生这种情况,因为我认为将

@Attribute(.unique)
放在 ID 上意味着同一类别不会被添加两次? 也不确定我是否正确地代表了父母/孩子的关系。我真正需要做的就是过滤到“顶级类别”(即没有parent_id),并获取给定类别的子类别。

谢谢!

swift swiftui swift-data
1个回答
0
投票

基于 this thread,将

modelContext.insert
modelContext.save
包装在
DispatchQueue.main.async
中解决了问题。

© www.soinside.com 2019 - 2024. All rights reserved.