如果服务器错误 401,防止 Restkit 删除孤立对象
Posted
技术标签:
【中文标题】如果服务器错误 401,防止 Restkit 删除孤立对象【英文标题】:Prevent Restkit from Deleting Orphaned Objects if Server error 401 【发布时间】:2014-01-22 13:37:10 【问题描述】:在我的应用程序中,我使用 Restkit 将 JSON 响应映射到核心数据。我使用 - addFetchRequestBlock - 这样restkit 将清理孤立对象。
// 清理孤立对象
[[RKObjectManager sharedManager] addFetchRequestBlock:^NSFetchRequest *(NSURL *URL)
// Value returned from the relativePath
RKPathMatcher *pathMatcher = [RKPathMatcher pathMatcherWithPattern:@"/filesystem/v1/folder/:folderId"];
NSDictionary *argsDict = nil;
BOOL match = [pathMatcher matchesPath:[URL relativePath] tokenizeQueryStrings:NO parsedArguments:&argsDict];
NSString *folderID;
if (match)
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"ADStorageEntity"];
// Get the folder ID
folderID = [argsDict objectForKey:@"folderId"];
// Setup the fetchRequest
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"parent = %@", @([folderID integerValue])]; // NOTE: Coerced from string to number
return fetchRequest;
return nil;
];
一切正常,但如果我遇到身份验证错误 401
文件列表请求失败并出现错误:Error Domain=org.restkit.RestKit.ErrorDomain Code=-1011 "Loaded an unprocessable error response (401)
“/:folderId”中的所有托管对象都被视为孤立对象并被删除。
有没有办法防止这种行为并且不执行孤立对象清理?
编辑-
似乎我正在映射错误
RKObjectMapping *errorMapping = [RKObjectMapping mappingForClass:[RKErrorMessage class]];
[errorMapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@"error.code" toKeyPath:@"code"]];
[errorMapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@"error.message" toKeyPath:@"message"]];
[errorMapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@"error.description" toKeyPath:@"description"]];
RKResponseDescriptor *errorDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:errorMapping method:RKRequestMethodAny pathPattern:nil keyPath:@"error" statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassClientError)];
[objectManager addResponseDescriptorsFromArray:@[errorDescriptor]];
删除错误映射后,Fetch Request Block 没有被调用
【问题讨论】:
获取请求块仅用于成功的映射,如果 401 引发错误,则不应删除任何内容。您的响应描述符/配置如何使用/处理 401? @Wain 谢谢你的评论,它让我找到了问题(见“编辑”).. 【参考方案1】:获取请求块仅用于成功的映射,如果 401 引发错误,则不应删除任何内容 - 如果您没有映射。
RKStatusCodeIndexSetForClass(RKStatusCodeClassClientError)
涵盖了 4xx 范围内的所有代码。你不需要使用它。如果您想忽略映射中的401
响应,则可以创建一个仅包含400
(或400
、402
等根据需要)的索引集。
【讨论】:
以上是关于如果服务器错误 401,防止 Restkit 删除孤立对象的主要内容,如果未能解决你的问题,请参考以下文章
我可以防止 RestKit+CoreData 覆盖本地实体更改吗?
PhoneGap / Cordova 回调错误 - 在 PhoneGap 中未执行 RestKit 完成功能
尝试通过 API 删除 gmail 邮件时出现 401 错误