如何解决处理 Xamarin.ios 中的部分 CloudKit 错误
背景
我正在学习本教程:https://www.toptal.com/ios/sync-data-across-devices-with-cloudkit
他有一个部分来处理用 swift 编写的 CloudKit 的部分错误:
Artisan::call('route:cache');
我正在尝试将其转换为 Xamarin 的 C#。但是我正在努力处理 CloudKit 错误,因为 Xamarin 似乎缺少 CKError 类。我在静态类中编写了以下内容:
public func isSpecificErrorCode(code: CKError.Code) -> Bool {
var match = false
if self.code == code {
match = true
}
else if self.code == .partialFailure {
// This is a multiple-issue error. Check the underlying array
// of errors to see if it contains a match for the error in question.
guard let errors = partialErrorsByItemID else {
return false
}
for (_,error) in errors {
if let cke = error as? CKError {
if cke.code == code {
match = true
break
}
}
}
}
return match
}
主要问题
我上面的解决方案似乎很笨拙,老实说不确定它是否有效。由于下面的编译错误,我无法真正进行测试。
但真正的问题来了。在他的下一个方法中,他以某种方式访问了 static public bool isSpecificErrorCode(CKErrorCode code,NSError error) {
var match = false;
if ((int)code == error.Code) {
match = true;
}
else if (code == CKErrorCode.PartialFailure) {
// This is a multiple-issue error. Check the underlying array
// of errors to see if it contains a match for the error in question.
NSDictionary errors = (NSDictionary)error.UserInfo.ObjectForKey(CKErrorFields.PartialErrorsByItemIdKey);
foreach (KeyValuePair<NSObject,NSObject> item in errors) {
var err = (NSError) item.Value;
if (err.Code == (int)code) {
match = true;
break;
}
}
}
return match;
}
和 clientRecord
,我假设它们是 serverRecord
的字段?我什至如何访问这些?我在我不理解的行中插入了一个箭头。当我只能访问 Xamarin 中的 NSError 时,我似乎需要访问 CKError 的某些内部属性。
CKError
尝试的解决方案(编译错误,数据缺失)
这是我无力的尝试:
// ServerRecordChanged errors contain the CKRecord information
// for the change that failed,allowing the client to decide
// upon the best course of action in performing a merge.
public func getMergeRecords() -> (CKRecord?,CKRecord?) {
if code == .serverRecordChanged {
// This is the direct case of a simple serverRecordChanged Error.
//here
return (clientRecord,serverRecord) // <-- this is what's confusing me!!!
//here
}
guard code == .partialFailure else {
return (nil,nil)
}
guard let errors = partialErrorsByItemID else {
return (nil,nil)
}
for (_,error) in errors {
if let cke = error as? CKError {
if cke.code == .serverRecordChanged {
// This is the case of a serverRecordChanged Error
// contained within a multi-error PartialFailure Error.
return cke.getMergeRecords()
}
}
}
return (nil,nil)
}
我确定我尝试的解决方案是否正朝着正确的方向发展。我不知道 public class MergeRecordPair {
public CKRecord clientRecord = null;
public CKRecord serverRecord = null;
}
static public MergeRecordPair getMergeRecords(this NSError error) {
if (error.Code == (int)CKErrorCode.ServerRecordChanged) {
// This is the direct case of a simple serverRecordChanged Error.
// here
return new MergeRecordPair {
clientRecord = clientRecord,// <-- How do I get these?
serverRecord = serverRecord // <-- How do I get these?
};
// here
}
if (error.Code == (int)CKErrorCode.PartialFailure) {
return new MergeRecordPair();
}
NSDictionary errors = (NSDictionary)error.UserInfo.ObjectForKey(CKErrorFields.PartialErrorsByItemIdKey);
if (errors == null) {
return new MergeRecordPair();
}
foreach (KeyValuePair<NSObject,NSObject> item in errors) {
var err = (NSError) item.Value;
if (err.Code == (int)CKErrorCode.ServerRecordChanged) {
return err.getMergeRecords();
}
}
return new MergeRecordPair();
}
和 clientRecord
是从哪里来的!也许我错过了我错过的 Swift 的一些细微差别。我从来没有快速编码过。任何建议都会有所帮助。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。