RestKit не удаляет потерянные объекты из локального хранилища
Привет я обновил RestKit с 0.10.2 до 0.20.3. После обновления теперь, когда объекты отсутствуют в веб-службе, 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. Вот новый Json для user_id = 2
{
"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
метод запроса.
Я делаю не так? или нужно сделать что-то еще для удаления объектов-сирот. Любая помощь приветствуется.
1 ответов
наконец решил проблему, отладив RestKit шаг за шагом и нашел этот код в RKManagedObjectRequestOperation.m
if (! [[self.HTTPRequestOperation.request.HTTPMethod uppercaseString] isEqualToString:@"GET"]) {
RKLogDebug(@"Skipping deletion of orphaned objects: only performed for GET requests.");
return YES;
}
о! RestKit не удаляет сиротские объекты, когда метод запроса POST
. Я изменил веб-службы accept GET
запрос тоже, и он работал отлично.
Во-вторых, я использовал predicate
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"user_id == %@", [DBUser currentUser].user_id];
это было неправильно, чтобы удалить все объекты, кроме текущего пользователя, мне пришлось добавить NOT
оператор, такой
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"user_id != %@", [DBUser currentUser].user_id];
так predicate
это не значит, что ты хочешь, но это то, чего ты не хочешь.