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:CKRecordChangedErrorServerRecordKeyclientRecord对应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
相关产品推荐
相关产品推荐

