Realm Sync SwiftUI下ObservedResults传递至自定义Picker时为空问题
解决Sync Realm下@ObservedResults映射数组为空的问题
针对你遇到的问题,核心原因是Sync Realm的数据加载是异步的,且SwiftUI视图参数中的集合操作(比如map)可能无法正确响应Realm动态集合的更新,以下是具体解决方法:
确认Sync订阅已正确配置
Sync Realm需要明确订阅数据集才能同步数据,确保你已为AccountType添加订阅,可在视图初始化或onAppear中执行:let subscription = $accountTypes.subscribe()还可通过监听订阅状态,确保数据加载完成后再渲染视图:
.onReceive(subscription.publisher) { state in if state == .complete { // 数据已同步完成 } }使用@DerivedProperty处理映射逻辑
不要直接在视图参数中调用map,而是通过@DerivedProperty将动态集合转换为静态数组,确保数据更新时自动同步:@ObservedResults(AccountType.self) var accountTypes @DerivedProperty private var accountTypeDescriptions: [String] { accountTypes.map { $0.typeDescription } }之后将
accountTypeDescriptions传给CustomPickerView:CustomPickerView( itemIndex: $accountTypeIndex, items: accountTypeDescriptions, length: accountTypeDescriptions.count, pickerName: Constants.accountTypePicker, offsetX: -95 )检查CustomPickerView的响应性
确保CustomPickerView能正确接收数组的动态更新:- 如果
items参数是普通数组,改为@Binding [String],让视图能感知数组变化自动刷新。 - 避免在CustomPickerView内部缓存数组数据,确保每次渲染都使用最新的传入值。
- 如果
验证AccountType属性的同步有效性
确认typeDescription属性是Realm对象的持久化属性,或计算属性依赖的所有属性都已被Realm同步:class AccountType: Object, ObjectKeyIdentifiable { @Persisted var typeDescription: String // 确保用@Persisted标记 // 其他属性... }如果是计算属性,要确保依赖的属性都被正确同步,否则映射时会得到空值。
内容的提问来源于stack exchange,提问作者Waner A. Peña Sánchez
相关产品推荐
相关产品推荐

