Остановить UIACtivityIndicatorView темпераментный iOS

Я делаю почтовый запрос, используя Async

[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)

У меня есть обратный вызов, когда соединение остановлено, и здесь я вызываю свой метод для остановки UIActivityIndicatorView

-(void)connectionDidFinishLoading:(NSURLConnection*)connection
{
NSLog(@"Connection finish");
[self stopAnimatingSpinner];
}

Вот метод остановки анимации (я пробовал комбинацию, и все нижеприведенные методы остановки, удаления скрытых методов

-(void)stopAnimatingSpinner{

[submittingActivity stopAnimating];
submittingActivity.hidden = YES;
[submittingActivity removeFromSuperview];
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];

}

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

Единственное, о чем я могу думать, это о том, что соединение блокирует основной поток, но почему иногда оно работает, а другие нет?


person Alex McPherson    schedule 13.04.2013    source источник
comment
Вы каждый раз печатаете Connection Finish на своей консоли?   -  person Gaurav Wadhwani    schedule 13.04.2013
comment
@GauravWadhwani да, я всегда получаю журнал, поэтому методы, называемые только пользовательским интерфейсом, не обновляются ... очень странно, как сказано, иногда это работает, а другие нет?   -  person Alex McPherson    schedule 13.04.2013
comment
Попробуйте закомментировать «removeFromSuperView», а затем попробуйте… я думаю, это может сработать… ИЛИ, как указано в ответе H2CO3 ниже, запустите обновления пользовательского интерфейса в основном потоке, если вы еще этого не делаете.   -  person Gaurav Wadhwani    schedule 13.04.2013
comment
@GauravWadhwani Я пробовал такое же поведение, боюсь, я думаю, что это связано с тем, что только что упомянул H2C03 ... но спасибо, сообщу после дополнительных тестов.   -  person Alex McPherson    schedule 13.04.2013


Ответы (2)


Две основные проблемы:

  1. Если вы используете метод sendAsynchronousRequest: (и т. д.) из NSURLConnection, то после завершения будет вызываться только блок завершения, а метод делегата connectionDidFinishLoading: — нет. Это другой API.

  2. Если вы обновляете пользовательский интерфейс, вы должны всегда делать это в основном потоке. В противном случае ваша программа вызовет неопределенное поведение. Поэтому оберните код, который останавливает анимацию, в блоке, который отправляется в основном потоке:

    dispatch_sync(dispatch_get_main_queue(), ^{ [self stopAnimatingSpinner]; });

person Community    schedule 13.04.2013
comment
Эй, H2CO3, я предполагал, что это могло быть так, я попробую и отчитаюсь. Спасибо - person Alex McPherson; 13.04.2013
comment
это, кажется, приводит к сбою приложения и перестает отвечать на запросы, т.е. ничего не может сделать и ничего в журнале... Я пробовал раньше... dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // Добавьте сюда код для фоновой обработки }) ; но он останавливается через некоторое время, но не тогда, когда я этого ожидаю ?? - person Alex McPherson; 13.04.2013
comment
@AlexMcPherson Я не понимаю вторую проблему, не могли бы вы перефразировать ее? - person ; 13.04.2013
comment
Я использовала dispatch_sync(dispatch_get_main_queue(), ^{[self stopAnimatingSpinner]; }); как уже упоминалось, и приложение зависает и не отвечает, не падает, и в журнале ничего не сообщается ... Я не понимаю, как это обойти. после неожиданного времени? - person Alex McPherson; 13.04.2013
comment
@AlexMcPherson Тогда еще что-то напортачило. - person ; 13.04.2013
comment
Я понял, что... может быть проблема в этой части запроса? очередь запросов: [NSOperationQueue mainQueue] или я должен сделать запрос другим способом? - person Alex McPherson; 13.04.2013
comment
@AlexMcPherson, честно говоря, не знаю. Когда я выполняю такую ​​обработку запросов и обновление пользовательского интерфейса, я использую то, что написал, и это работает. Может быть, вы также можете попробовать dispatch_async(), это тоже работает. - person ; 13.04.2013
comment
Я изменил этот dispatch_sync на этот dispatch_async, обратите внимание на асинхронность, и, похоже, он работает, проведет еще несколько тестов... - person Alex McPherson; 13.04.2013

Если вы вызываете NSURLConnection из основного потока, то ваш обработчик завершения также будет вызываться из основного потока. Следовательно, вы не должны вызывать dispatch_sync при остановке счетчика.

person sixthcent    schedule 13.04.2013
comment
Я изменил его на dispatch_async, и, похоже, это работает, и я проведу еще несколько тестов. - person Alex McPherson; 13.04.2013
comment
Я бы подумал, что в этом случае вам вообще не нужно использовать GCD, поскольку обработчик завершения уже находится в основном потоке. Итак, достаточно просто вызвать [self stopAnimatingSpinner]. - person sixthcent; 13.04.2013
comment
Боюсь, не потому, что я делал это все время, и причина этого вопроса в том, что иногда он запускает других, а не этот асинхронный, который был самым стабильным до сих пор и еще не работал, но буду продолжать его тестировать. - person Alex McPherson; 13.04.2013