You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

搜索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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 23:46:08