Отмена NSURLConnection Objective-C

У меня есть приложение tableview, которое, когда пользователь выбирает одно представление, ему необходимо проанализировать некоторый XML для отображения информации. Но иногда загрузка XML не завершена, и пользователь может нажать кнопку, чтобы выбрать другое представление, создавая сбой. Я думаю, что я нужно отменить соединение или что-то еще, чтобы не вызвать конфликт с новым соединением, но я точно не знаю, как это должно быть правильно в ViewWillDisappear? Вот как я запускаю соединение с ViewDidAppear:

NSMutableURLRequest * req = [[NSMutableURLRequest alloc]initWithURL:[NSURL URLWithString:@"http://Adress"]
                                                        cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:20.0f];

conn = [NSURLConnection connectionWithRequest:req delegate:self];

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

if(conn)
{
    receivedData = [[NSMutableData alloc]init];
    [DSBezelActivityView newActivityViewForView:self.view withLabel:@"Loading..."];
}


- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];

    if(conn) [conn cancel];
}

person Vinicius Albino    schedule 10.11.2011    source источник
comment
проблема не может быть отслежена из кода, которым вы поделились. вы должны предоставить методы делегата tableview вместе   -  person Saurabh Passolia    schedule 10.11.2011


Ответы (2)


Вы можете вызвать метод отмены NSURLConnection, и это предотвратит вызов вашего делегата соединений с какими-либо данными. Вы можете сделать это в viewWillDisappear, если это имеет смысл, учитывая, как работает ваше приложение.

person Tim Dean    schedule 10.11.2011
comment
Но чтобы отменить NSURLConnection, я должен правильно объявить его в файле .h? - person Vinicius Albino; 10.11.2011
comment
Да, вам придется сохранить ссылку, если вы захотите отменить ее позже. - person Tim Dean; 10.11.2011
comment
Я отредактировал сообщение в соответствии с кодом, который я использую сейчас, теперь я сохраняю ссылку, но как я могу проверить, получает ли соединение данные, чтобы отменить его, или попытаться отменить его, а соединение не происходит, это приводит к сбою. - person Vinicius Albino; 11.11.2011

Абсолютно можете cancel NSURLConnection.

Но вы должны быть осторожны при его отмене.

Если вы решите cancel сделать это в viewWillDisappear,

потом

Вы не должны делать,

autorelease

а также не следует,

release это где угодно.

Ниже краткое пояснение:

Сделайте cancel своего NSURLConnection делегата в viewWillDisappear

[nsurlconnection cancel];

а также вы должны release его здесь не где-либо,

[nsurlconnection release];

Если вы отпустите connection где-то, например, после того, как вы получили xml response, тогда,

Он все равно вызовет метод viewWillDisappear,

здесь вы отменяете его, тогда это приведет к сбою вашего приложения.

"освобожденные объекты не будут отменены"

.

А также при отмене произойдет другая ситуация,

Если пользователь приходит и сразу переходит к другому представлению в первый раз, ваш метод nsurlconnection будет отменен в методе viewWillDisappear.

Снова пользователь приходит к view и убегает непосредственно перед инициализацией или выделением вашего nsurlconnection, также ваше приложение будет аварийно завершено, потому что,

"освобожденные объекты не будут отменены".

Итак, проверьте свой connection != nil, прежде чем cancel его, а также не забудьте сделать

nsurlconnection = nil;

в то же время.

Так что вы можете избежать немедленных вызовов [nsurlconnection cancel].

Итак, наконец, в вашем методе viewWillDisappear вам нужно сделать следующее:

  1. Нужно проверить nsurlconnection != nil
  2. Нужно отменить это
  3. Необходимо выделить null для вашего nsurlconnection
  4. Нужно освободить его тем же методом.

Пример кода будет выглядеть следующим образом

- (void) viewWillDisappear:(BOOL)animated
{

if (nsurlconnection != nil)
{
[nsurlconnection cancel];
[nsurlconnection release];
nsurlconnection = nil;
}

}

Надеюсь, это полезно... Удачного кодирования...

person Kartihkraj Duraisamy    schedule 06.06.2013