10

こんにちは、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 から欠落しているため、ローカル ストレージから削除する必要があります。これが新しい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。そして、ここで私はWebサービスを呼び出しています

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

サーバーはリクエストメソッドを期待しているため、postObject代わりにを使用しています。私は間違っていますか?または、孤立したオブジェクトを削除するために何か他のことをする必要があります。どんな助けでも大歓迎です。getObjectsAtPathPOST

4

1 に答える 1

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;
    }

おー!リクエスト メソッドが の場合、RestKit は孤立したオブジェクトを削除しませんPOST。私はWebサービスもGETリクエストを受け入れるように変更しましたが、それは完全に機能しました。第二に、私は使用していましたpredicate

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

現在のユーザー以外のすべてのオブジェクトを削除するにはNOT、このように演算子を追加する必要がありました

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

つまりpredicate、あなたが望むものではありませんが、それはあなたが望まないものです。

于 2013-11-13T11:59:44.290 に答える