iphone: applicationWillTerminate не вызывается во время NSURLRequest? - PullRequest
1 голос
/ 01 марта 2010

Я работаю над приложением, в котором пользователь в какой-то момент должен ждать правильного ответа от веб-службы. Это может занять некоторое время, поскольку требует ручного подтверждения от веб-службы. Из-за этого значение timeoutInterval в запросе установлено очень высоким, чтобы предотвратить его преждевременное завершение.

Проблема возникает при запуске приложения сразу после возврата программы на начальный экран. Приложение не запустится (черный экран), и я думаю, что это потому, что запрос не был выпущен и все еще ожидает ответа (хотя я могу ошибаться).

Я попробовал метод applicationWillTerminate, но он не вызывается при нажатии кнопки home. Опять же, это может быть связано с тем, что приложение все еще ожидает ответа, но было бы очень полезно получить лучшее объяснение:)

Кроме того, кто-нибудь имеет представление о том, что делать?

код:

NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:urlAdress]
                                                          cachePolicy:NSURLRequestUseProtocolCachePolicy
                                                      timeoutInterval:10000];

    NSHTTPURLResponse* response = nil;  
    NSError* error = nil; 

    NSData *responseData = [NSURLConnection sendSynchronousRequest:theRequest   
                                                             returningResponse:&response   
                                                                         error:&error]; 

Ответы [ 2 ]

3 голосов
/ 01 марта 2010

Выполнение синхронного запроса в главном потоке блокирует весь цикл выполнения до тех пор, пока вы не получите ответ или не истечет время ожидания запроса. В течение этого времени ничего не будет вызываться, включая applicationWillTerminate. Это очень плохая идея сделать это. Вы должны либо отсоединить отдельный поток для запроса, либо создать асинхронный NSURLConnection.

При этом ОС все равно освободит всю память, когда закроет ваше приложение, поэтому маловероятно, что что-либо из последнего запуска будет «оставлено» после перезапуска. Если ваш сервер не заблокирован, потому что он потерял своего клиента, когда ваше приложение завершилось. В этом случае вы должны написать свой сервер так, чтобы он мог справиться с таким случаем, потому что это может произойти в любое время.

0 голосов
/ 16 июля 2010

Если метод делегата applicationWillTerminate не вызывается,

Тогда, я думаю, будет вызван следующий метод делегата.

- (void)applicationWillResignActive:(UIApplication *)application
{
  NSLog(@"Application Did Resign Active");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...