RestKit не удаляет потерянные объекты из локального хранилища

Привет, я обновил RestKit с 0.10.2 до 0.20.3. После обновления теперь, когда объекты отсутствуют в веб-службе, RestKit не удаляет их из локального хранилища. Я знаю, что он поддерживается в RestKit 0.20.x, но я не могу его настроить. Я следовал приведенному здесь примеру. http://restkit.org/api/latest/Classes/RKManagedObjectRequestOperation.html#overview

Я также следил за подобными вопросами на Stackoverflow. Но принятого ответа пока нет.

Вот мой джсон

{
    "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. Я делаю неправильно? или нужно сделать что-то еще для удаления потерянных объектов. Любая помощь приветствуется.


person Khawar    schedule 13.11.2013    source источник
comment
Вы отладили значение [DBUser currentUser].user_id? Предикат на самом деле не требуется, вы пробовали без предиката?   -  person Wain    schedule 13.11.2013
comment
Спасибо, @Wain, я искал тебя :), я отладил значение для предиката, и все было в порядке, позвольте мне попробовать без предиката.   -  person Khawar    schedule 13.11.2013
comment
Все то же самое, даже без предиката, предыдущие данные не удаляются.   -  person Khawar    schedule 13.11.2013
comment
Я думаю, мне нужно установить для deletesOrphanedObjects значение true, но не знаю, как это сделать, какие-либо предложения по этому атрибуту?   -  person Khawar    schedule 13.11.2013


Ответы (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 означает не то, что вы хотите, а то, чего вы не хотите.

person Khawar    schedule 13.11.2013
comment
Могу я просто добавить комментарий через три года... Предикат не означает ни то, что вы хотите удалить, ни то, что вы хотите, чтобы он означал, более или менее весь объект, ожидаемый в запросе, а затем все объекты в результатах вычитаются из того набора. - person netigger; 22.08.2016