我有一个类别模型,其定义如下:
@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),并获取给定类别的子类别。
谢谢!