搜索Realm ObservedResults时触发视图更新内发布变更错误
问题分析与解决
这不是你的代码写法错误,而是RealmSwift 10.45.2版本和iOS 17/Xcode 15中SwiftUI的searchable新特性存在兼容问题。
原因
iOS 17给searchable新增了直接绑定集合的重载方法,当你使用.searchable(text: $filter, collection: $users, keyPath: \.name)时,Realm的@ObservedResults在响应过滤更新时,内部的状态发布时机和SwiftUI的视图更新周期冲突,触发了SwiftUI的Fault级警告:Publishing changes from within view updates is not allowed, this will cause undefined behavior.
临时解决办法
放弃使用searchable的集合绑定重载,改为手动基于过滤词筛选结果:
import SwiftUI import RealmSwift class User: Object, Identifiable { @Persisted(primaryKey: true) var id: ObjectId @Persisted var name: String = "" } struct ContentView: View { @ObservedResults(User.self) var users @State private var filter = "" // 手动实现过滤逻辑 var filteredUsers: [User] { guard !filter.isEmpty else { return Array(users) } return users.filter { $0.name.localizedCaseInsensitiveContains(filter) } } var body: some View { NavigationStack { List { ForEach(filteredUsers) { user in Text(user.name) } } .navigationTitle("Users") .searchable(text: $filter) // 仅绑定搜索文本 } } }
这种方式将过滤逻辑掌握在自己手中,避开了Realm与SwiftUI新API的兼容冲突,不会再触发警告日志。另外,你也可以尝试升级RealmSwift到更高版本,后续版本大概率修复了该兼容问题。
内容的提问来源于stack exchange,提问作者Francesco Papagno
相关产品推荐
相关产品推荐

