检测到不正确的NSStringEncoding值0x0000。假设NSASCIIStringEncoding

时间:2014-04-06 10:23:04

标签: ios objective-c nsurlconnection nsmutableurlrequest

我使用此代码收到此错误:

    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。在这里使用异步请求有什么好处? 此外,更新代码很困难所以我将使用异步请求吗?

2 个答案:

答案 0 :(得分:2)

这段代码非常糟糕。

您正在使用ASCII编码获取响应数据并将其转换为字符串。嗯,这是垃圾,因为如果您的响应中有任何Unicode字符,它将失败。

然后将字符串转换为NSData对象并传递nil的字符串编码。编译器是否抱怨它?我打赌它确实如此。你应该在这里传递一个编码。同样,如果您不使用Unicode编码,如果您有一个包含Unicode字符的字符串,则无法创建任何数据。

整个双重转换是无稽之谈,因为NSJSONSerialization需要NSData,而你的原始响应是NSData,所以你所做的只是采取响应并按原样给它NSJSONSerialization,节省大量的内存,大量的CPU时间,以及它完全避免了你引入的双重错误。

答案 1 :(得分:0)

当您在主线程上运行时,Asynchrnous请求是有用的,这是UI线程。同步请求可能会导致您的用户界面在请求播出时空闲"空闲"。

对于异步请求,您将异步接收数据。收到数据时,会调用(委托协议)方法,然后处理收到的数据。