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

如何获取客户端MongoDB Realm的最后一次同步日期时间?

获取MongoDB Realm最后一次同步时间的实现方案

你观察的没错,RLMSyncManager类确实没有直接暴露最后一次同步时间的属性,你可以通过监听同步事件自行存储同步时间实现需求,具体方案如下:

  • 方案1:监听同步会话的下载完成通知实现
    可以监听RLMSyncSessionDidFinishDownloadNotification系统通知,每次Realm完成云端数据下载同步时,将当前时间持久化存储到本地(比如NSUserDefaults),后续需要展示时直接读取该值即可。
    注册通知代码示例:

    // 注册同步完成通知监听
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(handleSyncFinish:)
                                                 name:RLMSyncSessionDidFinishDownloadNotification
                                               object:nil];
    

    同步完成后存储时间的回调实现:

    - (void)handleSyncFinish:(NSNotification *)noti {
        // 同步完成,将当前时间存入本地
        NSDate *syncDate = [NSDate date];
        [[NSUserDefaults standardUserDefaults] setObject:syncDate forKey:@"kLastRealmSyncTimeKey"];
        [[NSUserDefaults standardUserDefaults] synchronize];
    }
    

    读取时间展示给用户的代码示例:

    NSDate *lastSyncDate = [[NSUserDefaults standardUserDefaults] objectForKey:@"kLastRealmSyncTimeKey"];
    if (lastSyncDate) {
        // 格式化日期展示给用户即可,比如"最后同步时间:2024-05-20 14:30"
        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
        formatter.dateFormat = @"yyyy-MM-dd HH:mm";
        self.syncTipLabel.text = [NSString stringWithFormat:@"最后同步时间:%@", [formatter stringFromDate:lastSyncDate]];
    } else {
        self.syncTipLabel.text = @"尚未完成首次数据同步";
    }
    
  • 方案2:通过同步进度回调实现更精准的同步状态记录
    如果需要区分上传、下载的同步时间,或者需要等本地变更上传到云端才算同步完成,可以使用RLMSyncSession的进度监听接口:

    RLMSyncSession *session = [RLMRealm defaultRealm].syncSession;
    // 监听上传同步完成事件
    [session addProgressNotificationForDirection:RLMSyncProgressDirectionUpload
                                            mode:RLMSyncProgressModeForCurrentlyOutstandingWork
                                           block:^(NSUInteger transferred, NSUInteger transferable) {
        if (transferred == transferable) {
            // 所有待上传内容同步完成,记录上传同步时间
            [[NSUserDefaults standardUserDefaults] setObject:[NSDate date] forKey:@"kLastUploadSyncTimeKey"];
        }
    }];
    
    // 监听下载同步完成事件
    [session addProgressNotificationForDirection:RLMSyncProgressDirectionDownload
                                            mode:RLMSyncProgressModeReportIndefinitely
                                           block:^(NSUInteger transferred, NSUInteger transferable) {
        if (transferred == transferable && transferable > 0) {
            // 所有待下载内容同步完成,记录下载同步时间
            [[NSUserDefaults standardUserDefaults] setObject:[NSDate date] forKey:@"kLastDownloadSyncTimeKey"];
        }
    }];
    

注意:

  1. 需要在合适的时机移除通知监听和进度监听,避免内存泄漏,如果你需要监听所有Realm实例的同步事件,建议将监听逻辑放到全局工具类中统一管理。
  2. 如果你需要仅同步成功时才更新时间,可以额外监听RLMSyncSessionDidReportErrorNotification判断同步是否出错,避免将同步失败的场景误判为同步完成。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 19:45:01