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