2010-03-01 2 views
1

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

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

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

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

код:

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]; 

ответ

3

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

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

+0

Вы были правы, это было плохо, чтобы сделать это так: P Мне пришлось переписать мой код на сервере .. спасибо за ваш ответ :) – Madoc

0

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

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

- (void)applicationWillResignActive:(UIApplication *)application 
{ 
    NSLog(@"Application Did Resign Active"); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^