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

CloudKit CKError扩展Objective-C不可用,如何获取serverRecord与clientRecord?

在Objective-C中获取CKError的serverRecord和clientRecord

你已经通过NSError分类成功拿到partialErrorsByItemID的思路非常对!因为在Objective-C里CloudKit的CKError本质上是包装在NSError中的,所有额外字段都存储在userInfo字典里,我们只需要找到对应的Key就能取出serverRecord和clientRecord。

核心思路

CloudKit为Objective-C开发者提供了专门的兼容Key来获取这两个记录:

  • serverRecord对应Key:CKRecordChangedErrorServerRecordKey
  • clientRecord对应Key:CKRecordChangedErrorClientRecordKey

注意:这两个字段仅在特定错误类型下存在,比如CKErrorServerRecordChanged(记录冲突),所以获取前要先判断错误码是否匹配。

代码实现(扩展你的NSError分类)

可以在你的NSError分类中新增两个方法来便捷获取这两个记录:

#import <CloudKit/CloudKit.h>

@interface NSError (CKErrorExtensions)

// 获取服务器上的冲突记录
- (CKRecord *)ck_serverRecord;
// 获取本地提交的冲突记录
- (CKRecord *)ck_clientRecord;

@end

@implementation NSError (CKErrorExtensions)

- (CKRecord *)ck_serverRecord {
    CKErrorCode errorCode = (CKErrorCode)self.code;
    if (errorCode == CKErrorServerRecordChanged) {
        return self.userInfo[CKRecordChangedErrorServerRecordKey];
    }
    return nil;
}

- (CKRecord *)ck_clientRecord {
    CKErrorCode errorCode = (CKErrorCode)self.code;
    if (errorCode == CKErrorServerRecordChanged) {
        return self.userInfo[CKRecordChangedErrorClientRecordKey];
    }
    return nil;
}

@end

使用示例

在处理CloudKit请求错误时,直接调用分类方法即可:

NSError *cloudKitError = ...; // 你的CloudKit请求返回的错误
CKRecord *serverRecord = [cloudKitError ck_serverRecord];
CKRecord *clientRecord = [cloudKitError ck_clientRecord];

if (serverRecord && clientRecord) {
    // 处理记录冲突:合并服务器记录与本地记录的更改
}

额外提醒

  • 确保项目中已导入CloudKit框架,否则会找不到CKRecordChangedErrorServerRecordKey这类宏定义;
  • 根据Apple官方文档,这两个字段主要用于解决记录冲突场景,所以优先针对CKErrorServerRecordChanged错误做判断即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:37:21