Отмена NSURLConnection Objective-C - PullRequest
1 голос
/ 10 ноября 2011

У меня есть приложение 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];
}

Ответы [ 2 ]

3 голосов
/ 10 ноября 2011

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

2 голосов
/ 06 июня 2013

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

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

Если вы решите cancel в viewWillDisappear,

затем

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

autorelease

, а также вы не должны,

release это никуда.

Здесьниже краткого объяснения:

Do cancel ваш NSURLConnection делегат в viewWillDisappear

[nsurlconnection cancel];

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

[nsurlconnection release];

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

В любом случае он вызовет метод viewWillDisappear,

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

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

.

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

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

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

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

Итак, проверьтеconnection != nil перед вами cancel это, а также не забывайте делать

nsurlconnection = nil;

в одно и то же время.

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

SO Наконец, в вашем viewWillDisappear методе, который вам нужно сделать, это

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

Пример кода будет похож наследующие,

- (void) viewWillDisappear:(BOOL)animated
{

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

}

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

...