2012-07-31 54 views
0

我正在使用Restkit的RKObjectManager和RKObjectMapping从GET服务使用GET成功检索JSON数据。这里是我的代码:使用RKObjectManager从INSERT的IOS进行POST

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

上面的代码工作,我很高兴地处理返回的数据。但是,我无法发布要插入数据库的记录。我想我可以重复使用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,也许映射和不处理返回)?

+0

你可以添加错误吗? – clopez 2012-07-31 18:22:23

+0

我对Xcode是如此的陌生以至于我不确定如何检索有关错误的有用信息。它在'main'报告“Thread1 Signal SIGBRT”中停止。有什么用? – Polly 2012-07-31 18:34:04

+0

以显示真正的异常尝试使用BreakPoint Navigator上的“All Exception BreakPoint”。 – clopez 2012-07-31 18:36:02

回答

0

张贴在评论中,尝试使用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]; 
    }; 

} 
+0

不,我还没有使用路由器,现在我应该读一读这是一种指向完整URL资源的方式,使用类似于我的第一个片段是? – Polly 2012-07-31 18:36:50

+0

嗯,这是我超越标记和脚本的第一步 - 在阅读和玩完你的代码几个小时之后,我深深地迷失了,粘贴你的代码,我在你的最后一行得到了'No Visible @Interface'err。任何暗示我如何可以纳入你的代码表示赞赏。我怀疑你的代码替换了我的第一个片段的最后两行。但在这个阶段真的超越了我。我经常跑之前跑:(:(无论如何谢谢! – Polly 2012-08-01 11:31:36