Проблема в NSURLConnection didFailWithError: обратный вызов отправляется несколько раз, когда время ожидания подключения - PullRequest
0 голосов
/ 18 июля 2011

Я использую NSURLConnection для извлечения данных из RSS-канала. Я установил значение тайм-аута по умолчанию на 30 секунд. В ситуациях с низким Wi-Fi-соединением я получаю ответ на тайм-аут (От не удалось с ошибкой) как обычно через 30 секунд. IУдостоверьтесь, что соединение сбрасывается при поступлении обратного вызова. Но еще через 30 секунд (в общей сложности 60 секунд после отправки запроса) я получаю еще один обратный вызов. Я пытался отладить, но второй обратный вызов не отслеживается нигде.

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

Вот мое создание соединения, делегат, FailwithError и Callback Function

//MainClass.m
- (void)LoadRSSFeed {
if (Stories == nil) {
    [activityIndicator startAnimating];
    rssParser = [[Parser alloc] init];
    [rssParser parseRssFeed:@"http://twitter.com/statuses/user_timeline/56202272.rss" withDelegate:self];
} else {
    [newsTable reloadData];
}

}

//Parser Class where connection is called
- (void)parseRssFeed:(NSString *)url withDelegate:(id)aDelegate {
[self setDelegate:aDelegate];
ERROR = FALSE;
responseData = [[NSMutableData data] retain];
NSURL *baseURL = [[NSURL URLWithString:url] retain];

NSLog(@"Creating Connection");
NSURLRequest *request = [NSURLRequest requestWithURL:baseURL      cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:30.0];
conn = [[[NSURLConnection alloc] initWithRequest:request delegate:self]  autorelease];
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
NSLog(@"Error");
ERROR = TRUE;
if (_delegate)
{
    [_delegate receivedItems:nil];
}
else
{ 

}
}

//Delegate Callback Function in MainClass.m
- (void)receivedItems:(NSArray *)theItems {

[rssParser setDelegate:nil];//setting delegates to nil
[rssParser release];
rssParser = nil;

Stories = theItems;
if([activityIndicator isAnimating]){
    if(Stories!=nil)
    {
        if([Stories count])
        {               
            [newsTable reloadData];
        }
    }else{
        NSLog(@"Showing Alert");
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Time Out"  delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil, nil];
        [alert show];
        [alert release];
    }
}
[activityIndicator stopAnimating];
}

Представление оповещения в функции обратного вызова вызывается дважды. После обычного 30-секундного тайм-аута и одного через 60 секунд, которое я не могу отследить. Даже если я добавляю точки останова или NSlogs перед представлением оповещений, они не вызываютсяили захватывает.

Любая помощь здесь будет действительно признательна.

Azeem

1 Ответ

0 голосов
/ 18 июля 2011

Документация для –[NSURLConnectionDelegate connection:didFailWithError:] гласит следующее:

Как только делегат получит это сообщение, он не получит больше сообщений для connection.

Спредставление предупреждений отображается в вашей реализации делегата Parser, возможно, вы звоните receivedItems: из других мест, чем ваш Parser объект.Фактически, поскольку точки останова и операторы журнала игнорируются, у вас может даже быть какой-то другой код, который показывает предупреждение о превышении времени ожидания (может быть, таймер или что-то в этом роде?), А не Parser обратный вызов делегата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...