使用RKObjectManager从IOS进行POST插入



我使用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,甚至可能重用映射。我不需要处理任何退货。

我尝试了以下片段的许多变体。没有用。

第一个片段是尝试重用管理器和映射。忽略这个伪代码中的映射范围,明显的缺陷是我无法找到如何POST到正确的URL资源(baseURL&'/insert_marker.php')。所以我实际上还没有尝试过这个:

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

第二个代码段运行,但导致应用程序崩溃。很明显,这在字符串和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,也许是映射,而不处理返回)?

如评论中所述,尝试使用NSString而不是RKURL,如下所示:

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

最新更新