Kha*_*war 10 json objective-c ios restkit restkit-0.20
您好我已经将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"
}
]
}
Run Code Online (Sandbox Code Playgroud)
返回特定用户的所有家庭成员.以上Json是为了user_id = 1.现在我想要发送请求user_id = 2,然后应该从本地存储中删除所有以前的3个对象,因为它们现在从Json中丢失了.这是新的Jsonuser_id = 2
{
"status": "Success",
"member_info": [
{
"family_id": "4",
"user_id": "2"
},
{
"family_id": "5",
"user_id": "2"
}
]
}
Run Code Online (Sandbox Code Playgroud)
这就是我创建映射的方式.
[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;
}
Run Code Online (Sandbox Code Playgroud)
在我正在使用的谓词中[DBUser currentUser].user_id,它返回登录的当前值user_id.这是我在呼叫网络服务
[[RKObjectManager sharedManager] postObject:nil path:@"familylist" parameters:params
success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
NSLog(@"Objects are %@", mappingResult.array);
}];
Run Code Online (Sandbox Code Playgroud)
我正在使用postObject而不是getObjectsAtPath,因为服务器正在期待POST请求方法.我做错了吗?或者需要做一些其他事情来删除孤儿对象.任何帮助表示赞赏.
Kha*_*war 11
最后通过逐步调试RestKit解决了这个问题,并在此处找到了此代码 RKManagedObjectRequestOperation.m
if (! [[self.HTTPRequestOperation.request.HTTPMethod uppercaseString] isEqualToString:@"GET"]) {
RKLogDebug(@"Skipping deletion of orphaned objects: only performed for GET requests.");
return YES;
}
Run Code Online (Sandbox Code Playgroud)
哦! RestKit在请求方法时不删除孤立对象POST.我也改变了Web服务的接受GET请求,它完美地运行了.其次我正在使用predicate
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"user_id == %@", [DBUser currentUser].user_id];
Run Code Online (Sandbox Code Playgroud)
这是错误的,要删除除当前用户之外的所有对象,我必须追加NOT运算符,就像这样
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"user_id != %@", [DBUser currentUser].user_id];
Run Code Online (Sandbox Code Playgroud)
所以predicate并不意味着你想要什么,但这是你不想要的.
| 归档时间: |
|
| 查看次数: |
1912 次 |
| 最近记录: |