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

RealmSwift与MongoDB不同步排查:SwiftUI项目代码缺失点咨询

Realm SwiftUI 数据同步失效问题排查

以下是代码中导致同步失败的核心问题及修复方案:

1. @AutoOpen 未使用正确的同步配置

AppView 中硬编码 APP_ID 初始化 @AutoOpen,完全忽略了 AppContainer 中配置的Flexible Sync 订阅规则,导致打开的 Realm 实例是本地默认配置,而非同步配置。

修复代码:

struct AppView: View {
    // 从环境中获取之前配置好的同步配置
    @Environment(\.realmConfiguration) private var syncConfig
    // 使用同步配置初始化 AutoOpen
    @AutoOpen(configuration: syncConfig, timeout: 4000) var autoOpen

    var body: some View {
        switch autoOpen {
        case .connecting:
            MessageView(message: "Connecting")
        case .waitingForUser:
            MessageView(message: "Waiting for user to log in...")
        case .open(let realm):
            HomeView()
                .environment(\.realm, realm)
        case .progress(let progress):
            LoadingView(progress: progress)
        case .error(let error):
            MessageView(message: error.localizedDescription)
                .foregroundColor(.red)
        }
    }
}

2. 订阅未确保生效

AppContainer 中添加订阅的逻辑没有确认订阅是否成功注册,也未等待订阅同步完成。Flexible Sync 需要订阅被服务器确认后,才会开始同步数据。

优化订阅逻辑:

在配置中添加 updateExisting: true 确保订阅更新,避免重复创建无效订阅:

let config = user.flexibleSyncConfiguration(initialSubscriptions: { subs in
    // 存在则更新,不存在则添加
    subs.append(QuerySubscription<Property>(name: "Property", updateExisting: true) {
        $0.ownerId == user.id
    })
})

3. 数据模型缺失同步必要配置

你未提供 Property 模型代码,但 Flexible Sync 要求:

  • 模型必须有主键(如 @Persisted(primaryKey: true) var _id: ObjectId)
  • 订阅中使用的字段(如 ownerId)必须存在,且在 MongoDB App Service 的同步规则中配置为允许用户访问(规则需限制用户只能读写 ownerId 等于自身 user.id 的文档)

示例 Property 模型:

import RealmSwift

class Property: Object {
    @Persisted(primaryKey: true) var _id: ObjectId
    @Persisted var ownerId: String
    // 其他业务属性...
}

4. @ObservedResults 未匹配订阅规则

HomeView 中直接查询所有 Property 实例,但 Flexible Sync 只会同步符合订阅规则的数据。建议显式过滤,确保与订阅逻辑一致:

struct HomeView: View {
    @Environment(\.realm) private var realm
    @ObservedResults(Property.self, where: { $0.ownerId == realm.configuration.syncConfiguration?.user.id }) var properties

    var body: some View {
        ForEach(properties) { property in
            Text(property.name) // 替换为模型实际属性
        }
    }
}

额外检查项

  • 确认用户已成功登录(app.currentUser 不为空)
  • 检查 MongoDB App Service 的同步状态是否正常,同步规则是否正确
  • 查看 Xcode 控制台日志,排查是否有同步权限错误或网络连接问题

内容的提问来源于stack exchange,提问作者AhmedEls

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 21:22:04