使用Predicate无法永久删除SwiftData模型的问题排查
SwiftData使用Predicate删除模型失效问题
我开发了一个SwiftData应用,模型定义如下:
@Model final class User: ObservableObject, Equatable { @Attribute(.unique) var id: UUID = UUID() //... }
当我尝试通过以下代码删除模型时:
List { ForEach(users, id: \.id) { aUser in //... HStack { Text("\(aUser.name)") Image(systemName: "minus.circle.fill") .foregroundStyle(.red) .onTapGesture { let theID = aUser.id // < 获取选中用户的引用,否则Predicate会崩溃 print(theID.uuidString) // < 控制台输出预期的字符串 // vv 如果使用anItem.id.uuidString == theID.uuidString会崩溃 try? modelContext.delete(model: User.self, where: #Predicate<User> { anItem in anItem.id == theID }) print(modelContext.hasChanges) // < **始终**为false modelContext.save() } } // ... }
看似删除了用户(偶尔删除的不是正确的用户),但重启应用后被删除的用户会重新出现。
而使用以下不借助Predicate的代码:
for i in 0 ..< users.count { if users[i].id.uuidString == theID.uuidString { modelContext.delete(users[i]) break } } print(modelContext.hasChanges) // < 找到用户时输出true
则一切正常,用户会被永久删除。
我曾猜测UUID实例比较可能总是返回false,但这无法解释“看似删除但重启后恢复”的现象。出于代码简洁性的考虑,我希望使用Predicate,因此想了解第一种代码无法正常工作的原因。
编辑
根据评论建议,我提供了一个SwiftFiddle示例,其中删除Item的操作更稳定,但通过Predicate删除时,.hasChanges始终为false,这是否是一个Bug?
内容的提问来源于stack exchange,提问作者Todd
相关产品推荐
相关产品推荐

