0

Restkit の RKObjectManager と RKObjectMapping を使用して、GET で Web サービスから JSON データを正常に取得しています。これが私のコードです:

- (void)viewDidLoad
{
    [super viewDidLoad];

    RKURL *baseURL = [RKURL URLWithBaseURLString:@"http://192.168.1.12"];
    RKObjectManager *objectManager = [RKObjectManager objectManagerWithBaseURL:baseURL];
    objectManager.client.baseURL = baseURL;

    RKObjectMapping *markerMapping = [RKObjectMapping mappingForClass:[Marker class]];
    [markerMapping mapKeyPath:@"la" toAttribute:@"lat"];
    [markerMapping mapKeyPath:@"lo" toAttribute:@"lon"];
    [markerMapping mapKeyPath:@"des" toAttribute:@"description"];
    [objectManager.mappingProvider setMapping:markerMapping forKeyPath:@"markers"];
}

- (void)sendGet
{
    NSString *lat = @"53.334932";
    NSString *lon = @"-0.543749";
    NSString *dist = @"1000";

    NSDictionary *queryParams;
    queryParams = [NSDictionary dictionaryWithObjectsAndKeys:lat, @"la", lon, @"lo", dist, @"d", nil];
    RKObjectManager *objectManager = [RKObjectManager sharedManager];

    RKURL *URL = [RKURL URLWithBaseURL:[objectManager baseURL] resourcePath:@"/get_markers.php" queryParameters:queryParams];
    [objectManager loadObjectsAtResourcePath:[NSString stringWithFormat:@"%@?%@", [URL resourcePath], [URL query]] delegate:self];
}

上記のコードは機能しており、返されたデータを喜んで処理しています。ただし、データベースに挿入するレコードを POST できません。私は、sharedManager と、場合によってはマッピングを再利用できると思います。私は返品を処理する必要はありません。

次のスニペットのさまざまなバリエーションを試しました。無駄に。

最初のスニペットは、マネージャーとマッピングを再利用する試みです。この疑似コードのマッピング スコープを無視すると、正しい URL リソース (baseURL & '/insert_marker.php') に POST する方法がわからないという明らかな欠陥があります。だから私は実際にこれを試していません:

- (void)postInsert
{  
    Marker *mkr = [Marker alloc];
    mkr.lat = @"53.334933";
    mkr.lon = @"-0.543750";
    mkr.description = @"some words";

    RKObjectManager *objectManager = [RKObjectManager sharedManager];
    [objectManager.mappingProvider setSerializationMapping:[markerMapping inverseMapping] forClass:[Marker class]];
    [[RKObjectManager objectManager] postObject:mkr delegate:nil];
}

この 2 番目のスニペットは実行されますが、アプリがクラッシュします。明らかに、これは string 型と url 型の間で混同されていますが、オブジェクト マネージャーの投稿は url でコンパイルされません。私は非常に混乱しています!

- (void)postInsert
{  
    RKParams* params = [RKParams params];
    [params setValue:@"53.334933" forParam:@"la"];
    [params setValue:@"-0.543750" forParam:@"l0"];
    [params setValue:@"some words" forParam:@"des"];

    RKObjectManager *objectManager = [RKObjectManager sharedManager];
    NSString *URL = [RKURL URLWithBaseURL:[objectManager baseURL] resourcePath:@"/add_marker.php"];
    [objectManager.client post:URL params:params delegate:nil];
}

では、params を使用して POST を実行するにはどうすればよいでしょうか (できれば、sharedManager を再利用し、おそらくマッピングを使用し、戻り値を処理しません)。

4

1 に答える 1

0

コメントに投稿されているように、次のように RKURL の代わりに NSStrings を使用してみてください。

NSString *baseUrl = @"https://mysite.com"; 
[RKObjectManager objectManagerWithBaseURLString:baseUrl];

より堅牢なものを作成したい場合は、objectManager のクライアントの代わりに objectManager を使用して投稿を作成することもできます。たとえば、ブロックを使用できます。

- (void) post: (id) myEntity onLoad:(RKObjectLoaderDidLoadObjectBlock) loadBlock onError:(RKRequestDidFailLoadWithErrorBlock)failBlock showingLoader:(BOOL)loaderWillShow{

    RKObjectMapping *mapping = [[RKObjectManager sharedManager].mappingProvider objectMappingForClass:[[myEntity class] class]];
    [[RKObjectManager sharedManager] postObject:myEntity usingBlock:^(RKObjectLoader *loader) {
        [self settingsForLoader:loader withMapping:mapping onLoad:loadBlock onError:failBlock showingLoader:loaderWillShow];
    }];

}

//Settings For Loader definition:



- (void) settingsForLoader: (RKObjectLoader *) loader withMapping: (RKObjectMapping *) mapping onLoad:(RKObjectLoaderDidLoadObjectBlock) loadBlock onError:(RKRequestDidFailLoadWithErrorBlock)failBlock showingLoader:(BOOL) loaderWillShow{

    loader.objectMapping = mapping;
    loader.delegate = self;
    loader.onDidLoadObject = loadBlock;

    loader.onDidFailWithError = ^(NSError * error){
       //NSLog(@"%@",error);
    };

    loader.onDidFailLoadWithError = failBlock;
    loader.onDidLoadResponse = ^(RKResponse *response) {
        [self fireErrorBlock:failBlock onErrorInResponse:response disablingLoader:loaderWillShow];
    };

}
于 2012-07-31T18:23:26.860 に答える