我正在尝试将数据发送到PHP Web服务器。
NSString *urlString = [NSString stringWithFormat: @"xxxxx.com/dbfuncts.php?action=createuser&user=%@&pword=%@&fname=%@&lname=%@&email=%@[&team_id=team_id]", [newPerson objectForKey:@"ua_username"], [newPerson objectForKey:@"ua_password"], [newPerson objectForKey:@"ua_fname"],[newPerson objectForKey:@"ua_lname"], [newPerson objectForKey:@"ua_email"], @@@@@];
//The array goes where '@@@@@' is.
NSURL *url = [NSURL URLWithString:urlString];
NSData* jsonData = [NSData dataWithContentsOfURL:url];
NSError *error;
id userProfile = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&error];
if(userProfile != nil){
NSLog(@"%@", userProfile);
return userProfile;
} else{
NSLog(@"ERROR");
return nil;
}
唯一的问题是我不知道如何在url中传递数组中的数据。我该怎么做?
答案 0 :(得分:1)
对于这种情况,您应该使用AFNetworking库
您只需在参数部分将数组设置为json,即'所有的魔法。
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.requestSerializer = [AFJSONRequestSerializer serializer];
NSDictionary *params = @{@"width": width, @"weight": weight};
[manager POST:@"https://mysite.com/myobject" parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"JSON: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];
要阻止主线程的执行直到操作完成,您可以在将操作添加到操作队列后执行[operation waitUntilFinished]。在这种情况下,您不需要在块中返回;设置__block变量就足够了。所以你用专用方法包装请求,并在调用它们之后做waitUntilFinished。但我认为,同步制作网络并不是一个好主意。
在您的请求加载的整个时间内,您的应用程序似乎已冻结 - 完全无法响应触摸和系统事件,直到请求完成。
至少,显示一个加载模式,在请求完成之前不会解除。更好的是,如果可能的话,使用户可以在加载请求时正常交互应用程序。
编辑
如果您需要在网络运行之前展示某些内容,那么您需要进行后续步骤。首先包装你的networkMethod:
- (void)postEventsWithHandler:(void (^)(BOOL isSuccess))handler
{
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.requestSerializer = [AFJSONRequestSerializer serializer];
NSDictionary *params = @{@"width": width, @"weight": weight};
[manager POST:@"https://mysite.com/myobject" parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"JSON: %@", responseObject);
handler(YES);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
Handler(NO)
}];
}
然后你需要从你的班级调用这个方法,在这种情况下,让我们想象一下,我们有NetworkClass包含所有网络请求。
// SHOW modal popup or hud (BMProgressHUD for example)
[NetworkClass postEventsWithHandlerWithHandler:^(BOOL isSuccess) {
// dismiss modal popup
// make something...
if (isSuccess)
{
}
else
{
}
}];