Правильная обработка [[NSURLConnection alloc] initWithRequest: … ]

#objective-c #ios #nsurlconnection

#objective-c #iOS #nsurlconnection

Вопрос:

Это может показаться вопросом новичка, однако я новичок в разработке iOS.

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

 mUploadeImageConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES];
[request release];
if (mUploadeImageConnection) {
    mUploadImageResponseData = [[NSMutableData data] retain];
} else {
[mUploadeImageConnection release];
}
  

Я также реализовал следующие методы для обработки состояния соединения

 - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
  

Когда я отправляю mUploadeImageConnection запрос, для получения ответа требуется некоторое время. Но я не жду ответа и не нажимаю кнопку возврата навигации, т. Е. Я открываю представление, но все же я получаю четыре функции обработки соединений, хотя представление, из которого был отправлен mUploadeImageConnection запрос, отображается. В случае didFailWithError я показываю некоторый AlertView, который в этом случае будет странно показывать, т. Е. Показывать alerView о каком-то представлении, которое уже появилось (не видно / пользователь перешел к предыдущему просмотру).

Итак, теперь мои вопросы

  • Какова наилучшая практика для решения такого рода ситуаций?
  • Как я могу заставить мои четыре функции остановиться?

Ответ №1:

Если вы хотите остановить запрос, сохраните NSURLConnection в переменной и вызовите

 [myConnection cancel];
  

Когда пользователь нажимает кнопку «Назад».

Например, вы можете вызвать отмену в делегате вашего навигационного контроллера, используя метод делегирования

 – navigationController:willShowViewController:animated:
  

проверяя, является ли ViewController, который будет показан, вашим RootViewController.

Комментарии:

1. Хах, спасибо, действительно простое решение, мне действительно нужно больше практики 🙂

2. Не беспокойтесь, рад помочь =) Не стесняйтесь голосовать и подтверждать мой ответ!