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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 02:37:23