使用JSON数据参数时NSURLSession崩溃为nil,同时管理错误

时间:2016-03-13 11:27:04

标签: ios json nsurlsession nserror nsurlsessiondatatask

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

我有一些奇怪的事情,我无法弄明白。当我检查服务器是否没有响应(离线)而不是通过返回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(错误)条件不能防止崩溃...

有人可以帮助我吗?

谢谢!

1 个答案:

答案 0 :(得分:5)

您应该在启动JSON之前添加if块。如:

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

之后,如果不是nil,您可以处理错误。