我使用此代码收到此错误:
NSMutableURLRequest *request = [ [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:URL_LOGIN_API]] autorelease];
[request setHTTPMethod:@"POST"];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setValue:@"application/x-www-form-urlencoded charset=utf-8" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:postData];
NSError *error;
NSURLResponse *response;
NSData *urlData=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
NSString *responseData=[[NSString alloc] initWithData:urlData encoding:NSASCIIStringEncoding];
...
NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:[responseData dataUsingEncoding:nil] options:NSJSONReadingMutableContainers error:&e];
使用新代码进行编辑:
NSError *error;
NSURLResponse *response;
NSData *urlData=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
NSError *e = nil;
NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:urlData options: NSJSONReadingMutableContainers error: &e];
NSString *response_code = [[dictionary objectForKey:@"data"] valueForKey:@"response"];
我也使用synchronousRequest。在这里使用异步请求有什么好处? 此外,更新代码很困难所以我将使用异步请求吗?
答案 0 :(得分:2)
这段代码非常糟糕。
您正在使用ASCII编码获取响应数据并将其转换为字符串。嗯,这是垃圾,因为如果您的响应中有任何Unicode字符,它将失败。
然后将字符串转换为NSData对象并传递nil的字符串编码。编译器是否抱怨它?我打赌它确实如此。你应该在这里传递一个编码。同样,如果您不使用Unicode编码,如果您有一个包含Unicode字符的字符串,则无法创建任何数据。
整个双重转换是无稽之谈,因为NSJSONSerialization需要NSData,而你的原始响应是NSData,所以你所做的只是采取响应并按原样给它NSJSONSerialization,节省大量的内存,大量的CPU时间,以及它完全避免了你引入的双重错误。
答案 1 :(得分:0)
当您在主线程上运行时,Asynchrnous请求是有用的,这是UI线程。同步请求可能会导致您的用户界面在请求播出时空闲"空闲"。
对于异步请求,您将异步接收数据。收到数据时,会调用(委托协议)方法,然后处理收到的数据。