Я получаю ошибку параметра, который не может быть nil obj c - PullRequest
0 голосов
/ 17 февраля 2020

эта функция является копией другого идентичного, но с другими ключами. с другой стороны, это работает, я не могу понять, почему здесь происходит сбой приложения ..

    #pragma mark - ChangePin
- (void) doChangePin: (NSString *) pinUser card: (NSString *) pinCard viewController: (UIViewController *) viewController success:(successSDKType)success failure:(failureSDKType)failure{

    self.mcPersonalEnrollmentRequest.mcCardPan = pinCard;

    PRLog(@"Pin Inserito: %@", pinUser);

    SecurityCryptogram *securityCryptogram = [CryptogramManager getSecurityCriptogramWithPan:pinCard pin:pinUser];

    self.mcPersonalEnrollmentRequest.securityCryptogram = securityCryptogram;
    self.mcPersonalEnrollmentRequest.mcIdPublicKey = [[ServiceDataManager getInstance] getIdPublicKey];

    NSDictionary* dtoReq = [self.mcPersonalEnrollmentRequest getDictionary];

    [self.netManager doRequestWithCommand:CMD_STATUS_CHECK dtoReq:dtoReq successCompletion:^(NetworkResponse *successData) {

        NSDictionary *resources = (NSDictionary *)[successData res];

        McCardEnrolled *mcCardEnrolled = [[McCardEnrolled alloc] initWithResDict:resources];
        [[ServiceDataManager getInstance] storeMcCard:mcCardEnrolled];

        McCard *mcCard = [mcCardEnrolled getCard];

        //We have to go on main thread to pop the controller
        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
            self.mcCardEnrollmentSuccessCallback(mcCard);
            self.cardEnrollmentViewController.navigationController.navigationBar.translucent = NO;
            [self.cardEnrollmentViewController.navigationController popViewControllerAnimated:YES];

            self.cardEnrollmentViewController = nil;
            self.mcCardEnrollmentSuccessCallback = nil;
            self.mcCardEnrollmentFailureCallback = nil;
            self.mcCardEnrollmentRequest = nil;

        }];


    } failureCompletion:^(Result *failureResult) {

        //Same of success case. We have to go on main thread to pop the controller
        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
            self.mcCardEnrollmentFailureCallback(failureResult);
            self.cardEnrollmentViewController.navigationController.navigationBar.translucent = NO;
            [self.cardEnrollmentViewController.navigationController popViewControllerAnimated:YES];

            self.cardEnrollmentViewController = nil;
            self.mcCardEnrollmentSuccessCallback = nil;
            self.mcCardEnrollmentFailureCallback = nil;
            self.mcCardEnrollmentRequest = nil;
        }];

    }];

ошибка:

Завершение приложения из-за необработанного исключения 'NSInvalidArgumentException', причина: ' *** - [__ NSDictionaryM setObject: forKey:]: объект не может быть nil (ключ: req) '

, которые изменяются следующими объектами или переменными: mcPersonalEnrollmentRequest CMD_STATUS_CHECK, который я воссоздал здесь для этой функции.

- (void) doRequestWithCommand:(NSString*)cmd dtoReq:(NSDictionary*)dtoReq successCompletion:(successCompletionType)success failureCompletion:(failureCompletionType)failure{

PRLog(@"NET-MAN> CMD:%@ - Prepare request with dtoReq: %@",cmd,[dtoReq description]);

NetworkRequest *request = [self prepareRequestForCommand:cmd dtoReq:dtoReq];
PRLog(@"NET-REQ> CMD:%@ - [DEBUG] Request created", cmd);

NSURLSessionConfiguration *defaultConfig = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration:defaultConfig delegate:self delegateQueue:nil];

NSURLSessionDataTask* task = [defaultSession dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
    PRLog(@"NET-MAN> CMD:%@ - Received response. Error: %@", cmd, [error description]);

    if (!error) {
        // Success
        NSString *errMsg;
        if ([response isKindOfClass:[NSHTTPURLResponse class]]) {

            NSDictionary *jsonResponse = [PRUtility dictionaryFromJsonData:data];
            if(jsonResponse){
                PRLog(@"NET-MAN> CMD:%@ - JSON RESPONSE != nil", cmd);

                NSDictionary* svcResDict = (NSDictionary*)[jsonResponse objectForKey:DTO_RESPONSE_TAG_SVC];
                if(svcResDict && svcResDict != (NSDictionary *)[NSNull null]){

                    PRLog(@"NET-MAN> CMD:%@ - Trying parsing response.",cmd);
                    NetworkResponse* networkResponse = [[NetworkResponse alloc] initWithCmd:cmd andNetworkData:svcResDict];

                    if (networkResponse) {
                        //Happy flow
                        PRLog(@"NET-MAN> CMD:%@ - Response created correctly.",cmd);

                        Result* resultForBadStatusCode = [self errorFromStatusCode:networkResponse.dtoStatus];

                        !resultForBadStatusCode ? success(networkResponse) : failure(resultForBadStatusCode);
                        return;
                    }
                    else{
                        errMsg = @"Error while accessing to networkResponse";
                    }
                }
                else{
                    errMsg = @"SVC field not found";
                }
            }
            else{
                errMsg = @"Cannot parses response into json";
            }
        }  else {
            errMsg = @"Recevied an error [response is not a NSHTTPURLResponse]";
        }

        Result *errorResponse = [[Result alloc] initGenericErrorWithMalformedNetworkResponse:errMsg];

        PRLog(@"NET-MAN: CMD:%@ - ERR: %@", cmd, errMsg);
        failure(errorResponse);

    } else {
        // Fail

        Result *errorNetwork = [self errorNetworkFromCode:error.code];

        PRLog(@"NET-MAN: CMD:%@ - ERR: %@", cmd, error.description);
        failure(errorNetwork);
    }

}];

PRLog(@"NET-MAN: CMD:%@ - Doing request...", request.cmd);
[task resume];

}

- (void) doRequestWithCommand:(NSString*)cmd dtoReq:(NSDictionary*)dtoReq successCompletion:(successCompletionType)success failureCompletion:(failureCompletionType)failure{

    PRLog(@"NET-MAN> CMD:%@ - Prepare request with dtoReq: %@",cmd,[dtoReq description]);

    NetworkRequest *request = [self prepareRequestForCommand:cmd dtoReq:dtoReq];
    PRLog(@"NET-REQ> CMD:%@ - [DEBUG] Request created", cmd);

    NSURLSessionConfiguration *defaultConfig = [NSURLSessionConfiguration defaultSessionConfiguration];
    NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration:defaultConfig delegate:self delegateQueue:nil];

    NSURLSessionDataTask* task = [defaultSession dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        PRLog(@"NET-MAN> CMD:%@ - Received response. Error: %@", cmd, [error description]);

        if (!error) {
            // Success
            NSString *errMsg;
            if ([response isKindOfClass:[NSHTTPURLResponse class]]) {

                NSDictionary *jsonResponse = [PRUtility dictionaryFromJsonData:data];
                if(jsonResponse){
                    PRLog(@"NET-MAN> CMD:%@ - JSON RESPONSE != nil", cmd);

                    NSDictionary* svcResDict = (NSDictionary*)[jsonResponse objectForKey:DTO_RESPONSE_TAG_SVC];
                    if(svcResDict && svcResDict != (NSDictionary *)[NSNull null]){

                        PRLog(@"NET-MAN> CMD:%@ - Trying parsing response.",cmd);
                        NetworkResponse* networkResponse = [[NetworkResponse alloc] initWithCmd:cmd andNetworkData:svcResDict];

                        if (networkResponse) {
                            //Happy flow
                            PRLog(@"NET-MAN> CMD:%@ - Response created correctly.",cmd);

                            Result* resultForBadStatusCode = [self errorFromStatusCode:networkResponse.dtoStatus];

                            !resultForBadStatusCode ? success(networkResponse) : failure(resultForBadStatusCode);
                            return;
                        }
                        else{
                            errMsg = @"Error while accessing to networkResponse";
                        }
                    }
                    else{
                        errMsg = @"SVC field not found";
                    }
                }
                else{
                    errMsg = @"Cannot parses response into json";
                }
            }  else {
                errMsg = @"Recevied an error [response is not a NSHTTPURLResponse]";
            }

            Result *errorResponse = [[Result alloc] initGenericErrorWithMalformedNetworkResponse:errMsg];

            PRLog(@"NET-MAN: CMD:%@ - ERR: %@", cmd, errMsg);
            failure(errorResponse);

        } else {
            // Fail

            Result *errorNetwork = [self errorNetworkFromCode:error.code];

            PRLog(@"NET-MAN: CMD:%@ - ERR: %@", cmd, error.description);
            failure(errorNetwork);
        }

    }];

    PRLog(@"NET-MAN: CMD:%@ - Doing request...", request.cmd);
    [task resume];

}

    - (NetworkRequest*) prepareRequestForCommand:(NSString*)cmd dtoReq:(NSDictionary*)dtoReq{
    NSMutableDictionary* dtoAppRequest = [[NSMutableDictionary alloc] init];
    [dtoAppRequest setObject:cmd
                      forKey:CMD_TAG];
    [dtoAppRequest setObject:dtoReq forKey:REQ_TAG];

    NetworkRequest *request = [[NetworkRequest alloc] initWithDtoAppRequest:dtoAppRequest
                                                             jSessionClient:self.userConfig.jSessionClient
                                                                     userId:self.userConfig.userId
                                                                 fiscalCode:self.userConfig.fiscalCode];

    [request completeRequestObject];

    return request;
}

1 Ответ

0 голосов
/ 17 февраля 2020

Это строка, которая генерирует nil, и nil не может быть вставлен в NSMutableDictionary,

NSDictionary* dtoReq = [self.mcPersonalEnrollmentRequest getDictionary];

Просто добавьте проверку для этого параметра с некоторой обработкой, и все будет в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...