管理错误时,带有 JSON 数据参数的 NSURLSession 崩溃为零

Posted

技术标签:

【中文标题】管理错误时,带有 JSON 数据参数的 NSURLSession 崩溃为零【英文标题】:NSURLSession crash with JSON data parameter is nil while error is managed 【发布时间】:2016-03-13 11:27:04 【问题描述】:

这个问题已经在别处提到过,但解决方案是处理错误。在这里,我认为我正确地处理了我的错误(但听起来我错了......)。

我有一些奇怪的东西我无法弄清楚。当我检查服务器是否没有响应(离线)而不是通过取回 JSON 对象时,我的应用程序崩溃了。在我的记忆中,这是在我处理 ios 9.2 之前工作的。

使用异常断点,我可以看到它与创建字典时为“nil”的数据参数有关(我猜这是正常的,因为服务器处于脱机状态并且没有返回任何内容)但应该避免崩溃管理错误...在我的代码中似乎并非如此。

几行:

NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:url]; // url with php script have been set before...

[urlRequest setHTTPMethod:@"POST"];
[urlRequest setHTTPBody:[noteDataString dataUsingEncoding:NSUTF8StringEncoding]];

NSURLSessionDataTask * dataTask =[defaultSession dataTaskWithRequest:urlRequest completionHandler:^(NSData *dataRaw, NSURLResponse *response, NSError *error) 
    NSDictionary *json = [NSJSONSerialization
                          JSONObjectWithData:dataRaw
                          options:kNilOptions error:&error];

    // I thought this condition below should manage the error when the json dictionary cannot be set because of the nil "dataRay" paramater but my app crashes.
    if (error) 
        UIAlertView * av = [[UIAlertView alloc] initWithTitle:[NSString stringWithFormat:@"Checking permission:\nGot error %@.\n", error] message:nil delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
        [av show];
        // (I know UIAlertView is deprecated in iOS 9.0 :-)...)
    

    NSString *status = json[@"status"];

    if([status isEqual:@"1"])
        //Success in php script

        UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"It works" message:nil delegate:self cancelButtonTitle:@"Cool" otherButtonTitles:nil, nil];
        [av show];

    

听起来 if (error) 条件并不能防止崩溃...

谁能帮帮我?

谢谢!

【问题讨论】:

【参考方案1】:

您应该在初始化 JSON 之前添加一个 if 块。如:

if(rawData != nil) 
    NSDictionary *json = [NSJSONSerialization
                          JSONObjectWithData:dataRaw
                          options:kNilOptions error:&error];

之后你可以处理你的错误,如果它不为零。

【讨论】:

听起来很明显... :-) 谢谢!

以上是关于管理错误时,带有 JSON 数据参数的 NSURLSession 崩溃为零的主要内容,如果未能解决你的问题,请参考以下文章

NSUrl POST 错误

iOS 9.1 导致我的 JSON NSURL 连接到 PHP 页面时出错

带有重音/拉丁字符的 JSON 请求

iOS 从带有 JSON 参数的 AFNetworking HTTP POST 方法获取 JSON 响应

无法使用类型为“(NSURL,*:NSString?)”的参数列表调用“*”

Rest API Post Json 使用带有两个参数的 C#