2014-06-27 5 views
2

Я разрабатываю приложение iOS, которое запускает несколько запросов NSURL. Я создал класс WebService, который реализует didReceiveData так:NSURLConnection call connectionDidFinishLoading перед этим?

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
    // Append the new data to the instance variable you declared 
    [_responseData appendData:data]; 
} 

где _responseData является свойство NSMutableData *. Затем я создал несколько подклассов, которые создают их конкретный запрос и реализуют connectionDidFinishLoading. В частности, у меня есть класс, который реализует RegisterService это так:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 
    // The request is complete and data has been received 
    // You can parse the stuff in your instance variable now 
    NSError *error = nil; 
    _parsedData = [NSJSONSerialization JSONObjectWithData:_responseData options:kNilOptions error:&error]; 
    NSLog(@"register data: %@",_parsedData); 
    registerAnswer serverAnswer = [[_parsedData objectForKey:@"success"] integerValue]; 

    if (serverAnswer == REGISTER_SUCCESS) { 
     // Give data to delegate to handle 
     [self.delegate successRegister]; 
    } 
    else { // serverAnswer == REGISTER_FAIL 
     NSLog(@"register message: %@",[[_parsedData objectForKey:@"message"] stringValue]); 
     [self.delegate failedRegister]; 
    } 
} 

У меня есть 2 разных контроллеров отображения, которые используют эту услугу. Один из них называет это так:

self.personRegistering.username = self.txtUsername.text; 
self.personRegistering.password = self.txtPassword.text; 
if (self.personRegistering.isCustomer) { 
    // register customer 
    DGRegisterService* myRegisterService = [[DGRegisterService alloc] initWithDelegate:self]; 
    [myRegisterService registerPerson:self.personRegistering]; 
} 
else { 
    // continue to get picture 
    [self performSegueWithIdentifier:@"RegisterPageThreeToFour" sender:self]; 
} 

и он отлично работает. На другой (страница 4) пользователь может сделать снимок, прежде чем он сможет зарегистрироваться. Вот код:

- (IBAction)btnTakePicture:(id)sender { 
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) { 
     // Camera is available 
     UIImagePickerController* myCamera = [[UIImagePickerController alloc] init]; 
     myCamera.sourceType = UIImagePickerControllerSourceTypeCamera; 
     myCamera.delegate = self; 
     [self presentViewController:myCamera animated:YES completion:NULL]; 
    } 
} 

#pragma mark - UIImagePicker Delegate 

- (void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { 
    [picker dismissViewControllerAnimated:YES completion:NULL]; 
    // Register person first 
    DGRegisterService* myRegisterService = [[DGRegisterService alloc] initWithDelegate:self]; 
    [myRegisterService registerPerson:self.personRegistering]; 

// // Now send pic 
// UIImage* picture = [info objectForKey:UIImagePickerControllerOriginalImage]; 
// DGUploadService* myUploadService = [[DGUploadService alloc]  initWithDelegate:self]; 
// [myUploadService uploadImage:picture forUsername:self.personRegistering.username]; 
} 

Теперь, второй один посылает запрос, а сервер обрабатывает его правильно, посылая назад этот объект JSON:

{"success":1,"message":"Account successfully created."} 

Что я ожидал. Однако оба утверждения NSLog показывают «(null)». Иногда приложение вылетает из-за того, что objectForKey отправляется в экземпляр, который не отвечает на него. В некоторых случаях консоль покажет объект JSON после того, как я нажму «Stop» на XCode. В остальное время он не разбивается и не показывает объект.

Поскольку эта страница использует камеру, я должен тестировать только на iPhone, а не на симуляторе. На другой странице объект JSON корректно выполняется каждый раз как в симуляторе, так и на iPhone. Я использую iPhone 4S с iOS7.1.1.

ответ

0

С этим кодом не было ничего плохого. По предложению Серджио я NSLogged полученные данные и ошибка. Разбор JSON не прошел, и печать необработанных данных показала, что скрипт php на стороне сервера отправляет сообщение об ошибке с объектом JSON, в результате чего он не обрабатывается должным образом. Мы исправили файл php, и теперь это работает.

2

Если вы имеете в виду, что NSLog в следующих строках:

NSError *error = nil; 
_parsedData = [NSJSONSerialization JSONObjectWithData:_responseData options:kNilOptions error:&error]; 
NSLog(@"register data: %@",_parsedData); 

иногда печатает «(нуль)», это может быть вызвано ошибкой в ​​JSONObjectWithData вызова.

Я хотел бы предложить, чтобы добавить

NSLog(@"received data: %@", _responseData); 

, чтобы проверить, что все в порядке с данными, и

NSLog(@"register data: %@ -- (error: %@)",_parsedData, [error localizedDescription]); 

, чтобы увидеть, если была возвращена ошибка.

+0

Благодарим вас за вход Серхио. Я добавил строки отладки, которые вы предложили, и выяснил, что данные на самом деле там, по крайней мере, в этом случае (я не знаю, правильно ли это, так как это шестнадцатеричный, но есть что-то там). Ошибка _ (Ошибка какао 3840.) _. Вы знаете, почему объект JSON может быть поврежден? Как может сервер иногда создавать правильный ответ? Еще раз спасибо за вашу помощь. – gamda

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