1

Restkit を使用してオブジェクトをサーバーに送り返す場合、画像を添付する場合にのみ、サブオブジェクトのネストされた配列に問題があります。

これは、すべてのリクエストに使用しているマッピングの概要です。

// mapping for post tag details
tagMapping = [RKObjectMapping mappingForClass:[TagObject class]];
[tagMapping mapKeyPath:@"id" toAttribute:@"tagId"];
[tagMapping mapKeyPath:@"name" toAttribute:@"tagName"];
[[RKObjectManager sharedManager].mappingProvider setMapping:tagMapping forKeyPath:@"tags"];
[[RKObjectManager sharedManager].mappingProvider setSerializationMapping:[tagMapping inverseMapping] forClass:[TagObject class]];

// mapping for posts
poastMapping = [[RKObjectMapping alloc] init];
poastMapping = [RKObjectMapping mappingForClass:[PoastObject class]];
[poastMapping mapKeyPath:@"id" toAttribute:@"poastId"];
[poastMapping mapKeyPath:@"user_id" toAttribute:@"userId"];
[poastMapping mapKeyPath:@"blurb" toAttribute:@"blurb"];
[poastMapping mapKeyPath:@"photo" toAttribute:@"photo"];
[poastMapping mapKeyPath:@"avatar" toAttribute:@"avatar"];
[poastMapping mapKeyPath:@"date_created" toAttribute:@"dateCreated"];
[poastMapping mapKeyPath:@"firstname" toAttribute:@"firstName"];
[poastMapping mapKeyPath:@"lastname" toAttribute:@"lastName"];
[poastMapping mapKeyPath:@"session" toAttribute:@"session"];
[poastMapping mapKeyPath:@"device" toAttribute:@"device"];
[poastMapping mapKeyPath:@"comments" toAttribute:@"iComments"];
[poastMapping mapKeyPath:@"commentcount" toAttribute:@"commentCount"];
[poastMapping mapKeyPath:@"pointcount" toAttribute:@"pointCount"];
[poastMapping mapKeyPath:@"heartcount" toAttribute:@"heartCount"];
[poastMapping mapKeyPath:@"postcount" toAttribute:@"postCount"];
[poastMapping mapKeyPath:@"hearted" toAttribute:@"hearted"];
[poastMapping mapKeyPath:@"total" toAttribute:@"total"];
[poastMapping mapKeyPath:@"tags" toRelationship:@"tags" withMapping:tagMapping];

[[RKObjectManager sharedManager].mappingProvider addObjectMapping:poastMapping];
[[RKObjectManager sharedManager].mappingProvider setMapping:poastMapping forKeyPath:@"posts"];
[[RKObjectManager sharedManager].mappingProvider setSerializationMapping:[poastMapping inverseMapping] forClass:[PoastObject class]];

そして、これはリクエストを送信するブロックです (特定の変更は、画像が添付されている場合にのみ発生することに注意してください)

[[RKObjectManager sharedManager] sendObject:obj toResourcePath:@"/posts/submit" usingBlock:^(RKObjectLoader *loader) {
        loader.targetObject = nil;
        loader.delegate = self;
        loader.method = RKRequestMethodPOST;

        if([obj image]){
            RKObjectMapping* serializationMapping = [[[RKObjectManager sharedManager] mappingProvider] serializationMappingForClass:[PoastObject class]];
            NSError* error = nil;
            NSDictionary* dictionary = [[RKObjectSerializer serializerWithObject:obj mapping:serializationMapping] serializedObject:&error];
            RKParams* params = [RKParams paramsWithDictionary:dictionary];
            NSData* imageData =  UIImagePNGRepresentation([obj image]);
            [params setData:imageData MIMEType:@"image/png" forParam:@"image"];
            loader.params = params;
        }
    }];

画像なしでリクエストを送信すると、「tags」配列が期待どおりにタイプ「array」として PHP に到着します。ただし、画像を含むリクエストを送信すると、タグ配列は「文字列」型として取得され、次のようになります。

( { id = 2; name = 科学; }, { id = 4; name = アカデミック; } )

4

1 に答える 1

3

これを回避する唯一の方法は、ネストされた配列をそのパラメーターの JSON エンコード文字列として再度追加し、サーバー側で json_decode を追加することでした。なぜこのバグが発生するのかはまだわかりません。

更新されたコード:

[[RKObjectManager sharedManager] sendObject:obj toResourcePath:@"/posts/submit" usingBlock:^(RKObjectLoader *loader) {

    loader.targetObject = nil;
    loader.delegate = self;
    loader.method = RKRequestMethodPOST;

    RKObjectMapping* serializationMapping = [[[RKObjectManager sharedManager] mappingProvider] serializationMappingForClass:[PoastObject class]];
    NSError* error = nil;
    NSDictionary* dictionary = [[RKObjectSerializer serializerWithObject:obj mapping:serializationMapping] serializedObject:&error];

    // grab the tag array
    NSArray *tags = [dictionary objectForKey:@"tags"];
    NSString *tagData = [tags JSONString];

    RKParams* params = [RKParams paramsWithDictionary:dictionary];

    // assign tags as a value in the parameters manually
    [params setValue:tagData forParam:@"tags"];

    // add image if it exists
    if([obj imageV]){
        NSData* imageData =  UIImageJPEGRepresentation([obj imageV], 0.75);
        [params setData:imageData MIMEType:@"image/jpg" forParam:@"image"];
    }

    loader.params = params;

}];
于 2012-10-22T18:04:30.727 に答える