如何获取客户端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"]; } }];
注意:
- 需要在合适的时机移除通知监听和进度监听,避免内存泄漏,如果你需要监听所有Realm实例的同步事件,建议将监听逻辑放到全局工具类中统一管理。
- 如果你需要仅同步成功时才更新时间,可以额外监听
RLMSyncSessionDidReportErrorNotification判断同步是否出错,避免将同步失败的场景误判为同步完成。
内容的提问来源于stack exchange,提问作者XYZ
相关产品推荐
相关产品推荐

