PurgeIdleCellConnections
О "дублированном" состоянии этого вопроса:
Этот вопрос здесь был задан в ноябре 2012 года, он содержит подробное описание проблемы и имеет 3 ответа.
Вопрос, упомянутый как "оригинал", был задан в феврале 2013 года (через 3 месяца после этого "дубликата" ), не имеет подробного описания и только 2 ответа. Лучший из двух ответов - это всего лишь ответ только для ссылок.
Почему я получаю это сообщение в консоли?:
purgeIdleCellConnections: found one to purge conn = (some object-ID)
Когда мое приложение запускается, я отправляю сообщение на свой сервер. Я делаю это с помощью этих строк кода:
@implementation AppStatus {
NSMutableData* activeDownload;
NSURLConnection* Connection;
}
- (id) init {
self = [super init];
if (self) {
activeDownload = nil;
Connection = nil;
}
return self;
}
- (void)sendStatus:(NSString*)url {
NSString* escaped = [url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURLConnection* conn =[[NSURLConnection alloc] initWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:escaped]] delegate:self];
Connection = conn;
NSLog(@"%s Connection=%@",__PRETTY_FUNCTION__,Connection);
}
В том же файле у меня есть эти методы-делегаты:
- (void)connection:(NSURLConnection*)connection didReceiveData:(NSData*)data {
NSLog(@"%s connection=%@",__PRETTY_FUNCTION__,connection);
[activeDownload appendData:data];
}
- (void)connection:(NSURLConnection*)connection didFailWithError:(NSError*)error {
NSLog(@"%s connection=%@",__PRETTY_FUNCTION__,connection);
activeDownload = nil;
Connection = nil;
//do nothing else; just ignore the error
}
- (void)connectionDidFinishLoading:(NSURLConnection*)connection {
NSLog(@"%s Connection=%@",__PRETTY_FUNCTION__,Connection);
NSString* answer = [[NSString alloc] initWithData:activeDownload encoding:NSUTF8StringEncoding];
//do something usefull with the server answer
activeDownload = nil;
Connection = nil;
}
Когда я запускаю это приложение на реальном устройстве (не на симуляторе), я получаю это сообщение в консоли:
2012-11-22 20:41:51.309 BookMan[376:907] -[AppStatus sendStatus:] Connection=<NSURLConnection: 0x1dd7ff40>
2012-11-22 20:41:51.929 BookMan[376:907] -[AppStatus connection:didReceiveData:] Connection=<NSURLConnection: 0x1dd7ff40>
2012-11-22 20:41:51.935 BookMan[376:907] -[AppStatus connectionDidFinishLoading:] Connection=<NSURLConnection: 0x1dd7ff40>
purgeIdleCellConnections: found one to purge conn = 0x1dd8ff60
Сообщение purgeIdleCellConnections появляется примерно через 4 или 5 секунд после сообщения connectionDidFinishLoading.
Как вы можете видеть, номер объекта сообщения purgeIdleCellConnections не совпадает с номером соединения, которое я создал и использовал в своем приложении.
Возможно ВАЖНО: я получаю это сообщение только при запуске приложения на реальном устройстве (iPhone 4 с iOS 6.0.1). Это устройство использует 3G-соединение, а не WIFI-соединение. На данный момент у меня нет WIFI-сети, чтобы проверить, действительно ли это происходит на WIFI-подключении.
Я не получаю это сообщение, когда запускаю приложение на симуляторе.
Когда я меняю метод sendStatus: на это:
- (void)sendStatus:(NSString*)url {
NSString* escaped = [url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
//NSURLConnection* conn =[[NSURLConnection alloc] initWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:escaped]] delegate:self];
//Connection = conn;
NSLog(@"%s Connection=%@",__PRETTY_FUNCTION__,Connection);
}
Я получаю этот вывод в консоли:
2012-11-22 20:45:11.927 BookMan[391:907] -[AppStatus sendStatus:] Connection=(null)
Я не получаю сообщение purgeIdleCellConnections, когда не создаю соединение.
Итак, что означает это сообщение и почему я его получаю?
purgeIdleCellConnections: found one to purge conn = (some object-ID)
Ответы
Ответ 1
Это означает, что соединение, которое слишком долгое время простаивало, закрыло TCP-соединение. Это основной механизм, и он не должен беспокоить вас, поскольку Apple заявляет о Technical QA1774, это сообщение об ошибке, которое было ошибочно, разрешено.
Этот журнал действительно отображается только при удалении WWAN-соединений.
Ответ 2
Да, это ОС, закрывающая активные соединения по сотовым данным, только 3G. Вы не должны видеть это с помощью Wi-Fi-соединения. Похоже, что очистка соединений с ОС добавляет немного времени для отправки запроса данных на сервер.
Ответ 3
Когда на устройстве, подключенном к сотовой сети, я заметил это отладочное сообщение, выходящее из SDK iOS 6.0. С учетом времени я считаю, что это коррелирует с "активными" вызовами AJAX, которые заканчиваются в моем приложении. Однако это очень сложно доказать, так как это происходит только при рендеринге веб-страницы в UIWebView. Я просто говорю, что я не думаю, что сообщения являются доброкачественными. Я думаю, что они могут указывать на ошибку в структуре Apple, которая чрезмерно агрессивна при завершении соединений. Трудно получить инструментарий на javascript, запущенном внутри UIWebView, который вызывает вызовы AJAX, поэтому в это время все они очень спекулятивны.