gpt4 book ai didi

ios - RestKit 没有从本地存储中删除孤立的对象

转载 作者:技术小花猫 更新时间:2023-10-29 11:03:06 26 4
gpt4 key购买 nike

您好,我已将 RestKit 从 0.10.2 更新到 0.20.3。现在更新后,当 Web 服务中缺少对象时,RestKit 不会将它们从本地存储中删除。我知道 RestKit 0.20.x 支持它,但我无法配置它。我按照这里给出的例子。 http://restkit.org/api/latest/Classes/RKManagedObjectRequestOperation.html#overview

我也在 Stackoverflow 上关注了类似的问题。但目前还没有公认的答案。

这是我的 Json

{
"status": "Success",
"member_info": [
{
"family_id": "1",
"user_id": "1"
},
{
"family_id": "2",
"user_id": "1"
},
{
"family_id": "3",
"user_id": "1"
}
]
}

返回特定用户的所有家庭成员。以上 Json 适用于 user_id = 1。现在我想如果为 user_id = 2 发送请求,那么之前的所有 3 个对象都应该从本地存储中删除,因为它们现在从 Json 中丢失了。这是 user_id = 2

的新 Json
{
"status": "Success",
"member_info": [
{
"family_id": "4",
"user_id": "2"
},
{
"family_id": "5",
"user_id": "2"
}
]
}

这就是我创建映射的方式。

[objectManager addResponseDescriptorsFromArray:@[                                                                                                                  
[RKResponseDescriptor responseDescriptorWithMapping:[self connectionsMapping]
method:RKRequestMethodPOST
pathPattern:@"familylist"
keyPath:@"member_info" statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]];



[objectManager addFetchRequestBlock:^NSFetchRequest *(NSURL *URL) {
RKPathMatcher *pathMatcher = [RKPathMatcher pathMatcherWithPattern:@"familylist"];
NSDictionary *argsDict = nil;
BOOL match = [pathMatcher matchesPath:[URL relativePath] tokenizeQueryStrings:NO parsedArguments:&argsDict];
if (match) {
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"DBConnections"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"user_id == %@", [DBUser currentUser].user_id];
fetchRequest.predicate = predicate;
fetchRequest.sortDescriptors = @[ [NSSortDescriptor sortDescriptorWithKey:@"first_name" ascending:YES] ];
return fetchRequest;
}

return nil;
}];


- (RKEntityMapping *)connectionsMapping {
RKEntityMapping *connectionsMapping = [RKEntityMapping mappingForEntityForName:@"DBConnections" inManagedObjectStore:objectManager.managedObjectStore];
connectionsMapping.setDefaultValueForMissingAttributes = NO;
connectionsMapping.identificationAttributes = @[@"family_id"];
[connectionsMapping addAttributeMappingsFromDictionary:@{
@"family_id": @"family_id",
@"user_id": @"user_id",
}];

return connectionsMapping;
}

在谓词中,我正在使用 [DBUser currentUser].user_id,它返回当前登录的 user_id。这是我正在调用网络服务

[[RKObjectManager sharedManager] postObject:nil path:@"familylist" parameters:params
success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
NSLog(@"Objects are %@", mappingResult.array);
}];

我正在使用 postObject 而不是 getObjectsAtPath,因为服务器需要 POST 请求方法。我做错了吗?或者需要做其他事情来删除孤立对象。感谢您的帮助。

最佳答案

最终通过调试RestKit一步步解决问题,在RKManagedObjectRequestOperation.m中找到这段代码

if (! [[self.HTTPRequestOperation.request.HTTPMethod uppercaseString] isEqualToString:@"GET"]) {
RKLogDebug(@"Skipping deletion of orphaned objects: only performed for GET requests.");
return YES;
}

哦!当请求方法为 POST 时,RestKit 不会删除孤立对象。我也更改了接受 GET 请求的 Web 服务,它运行良好。其次,我使用的是 predicate

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"user_id == %@", [DBUser currentUser].user_id];

这是错误的,要删除除当前用户之外的所有对象,我必须附加 NOT 运算符,就像这样

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"user_id != %@", [DBUser currentUser].user_id];

所以predicate不是你想要的,而是你不想要的。

关于ios - RestKit 没有从本地存储中删除孤立的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19951726/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com