如果服务器错误 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(或400402 等根据需要)的索引集。

【讨论】:

以上是关于如果服务器错误 401,防止 Restkit 删除孤立对象的主要内容,如果未能解决你的问题,请参考以下文章

防止空 JSON 响应被映射 RestKit 0.22.0

我可以防止 RestKit+CoreData 覆盖本地实体更改吗?

PhoneGap / Cordova 回调错误 - 在 PhoneGap 中未执行 RestKit 完成功能

尝试通过 API 删除 gmail 邮件时出现 401 错误

RestKit、NSFetchedResultsController 和删除孤立对象

RestKit 删除语义