2015-07-02 2 views
0

У меня есть следующий код, и я хотел бы сделать его синхронным. Проблема, с которой я сталкиваюсь, заключается в том, что, хотя моя api называется моей программой, продолжается, и значения данных nil передаются в среднем. Благодарим вас за помощь. \Сделать API-вызов синхронным

{- (IBAction) Make_Payment: (идентификатор) отправитель {

NSString *temp2 = [NSString stringWithFormat:@"{\n \"partner_key\": \"%@\",\n \"auth_token\": \"QaU9QcFZ6xE7aiRRBge0wZ4p6E01GEbl\",\n \"payment_account_id\": \"%@\",\n \"card_number\": \"%@\",\n \"card_exp_date\": \"%@\",\n \"amount\": \"%@\",\n \"memo\": \"%@\",\n \"recipient\": {\n \"email\": \"%@\",\n \"mobile_phone\": \"%@\"\n }\n}",[Partner_Key text], [Payment_Account_ID text], [Card_Number text], [Card_Exp_Date text], [Amount text],[Memo text], [Recipient_Email text], [Recipient_Phone_Number text]]; 

NSLog(temp2); 

NSNumber *errorCode = nil; 
NSString *errorMessage = nil; 
NSString *guid1   = nil; 
NSString *exponent  = nil; 
NSString *modulus  = nil; 

NSURL *URL = [NSURL URLWithString:@"https://cert.payzur.com/payzurservices.svc/payment/send/initiate"]; 

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL]; 
[request setHTTPMethod:@"POST"]; 

[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; 

[request setHTTPBody:[temp2 dataUsingEncoding:NSUTF8StringEncoding]]; 




NSURLSession *session = [NSURLSession sharedSession]; 
[[session dataTaskWithURL:[NSURL URLWithString:URL] completionHandler:^(NSData *data,NSURLResponse *response,NSError *error) { 
    if(error && failure) 
    { 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      failure(error); 
     }); 
    } 
    else if(success) 
    { 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      success(data); 
     }); 
    } 

}] resume]; 
NSURLSessionDataTask *task = [session dataTaskWithRequest:request 
             completionHandler: 
           ^(NSData *data, NSURLResponse *response, NSError *error) { 

            if (error) { 
             // Handle error... 
             return; 
            } 

            if ([response isKindOfClass:[NSHTTPURLResponse class]]) { 
             NSLog(@"Response HTTP Status code: %ld\n", (long)[(NSHTTPURLResponse *)response statusCode]); 
             NSLog(@"Response HTTP Headers:\n%@\n", [(NSHTTPURLResponse *)response allHeaderFields]); 
            } 

            NSString* body = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
            NSLog(@"Response Body:\n%@\n", body); 

            NSError *error1; 
            NSDictionary *res = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error]; 
            NSLog(@"res: \n%@", res); 

            if (res) { 
             NSString *errorCode = res[@"error_code"]; 
             NSString *errorMessage = res[@"error_message"]; 
             NSString *guid1   = res[@"guid"]; 
             NSString *exponent  = res[@"exponent"]; 
             NSString *modulus  = res[@"modulus"]; 

            NSLog(@"errorCode: %@\nerrorMessage: %@\nguid: %@\nexponent: %@\nmodulus: %@", errorCode, errorMessage, guid1, exponent, modulus); 


            } 
            else { 
             NSLog(@"Error: %@", error); 
            } 


           }]; 
[task resume]; 

}

+0

Извините, я не понимал, что это была проблема с другим вопросом, поэтому я удалил свой ответ, так как он был таким же, как и мой комментарий. – zaph

+0

Полностью, поймите! – Neil

ответ

0

использование Make заканчивания блока NSURLSession. Действия, которые вы хотите выполнить, просто выполните их в блоке завершения. Убедитесь, что всякий раз, когда вы выполняете некоторые задачи пользовательского интерфейса в блоке завершения NSURLSession, выполните их в основном потоке.

-(void)sendRequestForURL:(NSString*)urlString Success:(void(^)(NSData *data))success Failure: (void(^)(NSError *error))failure 
    { 
     NSURLSession *session=[NSURLSession sharedSession]; 
     [[session dataTaskWithURL:[NSURL URLWithString:urlString] completionHandler:^(NSData *data,NSURLResponse *response,NSError *error) { 
      if(error && failure) 
      { 
       dispatch_async(dispatch_get_main_queue(), ^{ 
        failure(error); 
       }); 
      } 
      else if(success) 
      { 
       dispatch_async(dispatch_get_main_queue(), ^{ 
        success(data); 
       }); 
      } 

     }] resume]; 
    } 
+0

Я обновил то, что вы сказали мне добавить в мой код, но по какой-то причине я получаю несколько ошибок, можете ли вы сказать мне, что я сделал не так? – Neil

+0

Прежде всего, вы делаете вызов веб-службы от самого контроллера. Это очень плохой дизайн. Создайте отдельный класс, который отвечает за вызов веб-службы. Используйте этот класс для вызова веб-службы. Какие ошибки вы получаете? – shoan

+0

Я обновил код в своем ответе с тем, что вы сказали мне добавить. И тогда ошибки, которые я получаю, являются несовместимыми типами указателей, отправляющих «NSURL в параметр типа NSString» также, использование отказа незаявленного идентификатора, неявное объявление отказа в c99 недопустимо, использование необъявленного успеха индексатора означает, что вы имели в виду доступ и неявное объявление успеха функции в c99 недействителен. – Neil

Смежные вопросы