Обсуждение метода didReceiveData для HTTP-соединения - PullRequest
3 голосов
/ 16 марта 2009

Я создал независимый класс для HTTP-соединения. Все соединение работает отлично. Проблема в том, что я обнаружил, что метод didReceiveData будет вызываться ПОСЛЕ метода, который вызывает соединение. (метод didReceiveData будет вызван после принятия команды IBAction)


- (IBAction)accept:(id)sender {
    [self connect:url];
    //labelStr = ReturnStr; Cannot be written here. 
}

-(void)connect:(NSString *)strURL
{
    NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:strURL]
                                              cachePolicy:NSURLRequestUseProtocolCachePolicy
                                          timeoutInterval:60.0];

    NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
    if (theConnection) 
    {
        // receivedData is declared as a method instance elsewhere
        receivedData = [[NSMutableData data] retain];
    } 
    else 
    { 
        // inform the user that the download could not be made
    }
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    // append the new data to the receivedData
    [receivedData appendData:data];
    ReturnStr = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
}

Это вызовет проблему, заключающуюся в том, что если я хочу изменить текст метки на полученную строку, код не может быть записан в IBAction 'accept', но должен быть записан в методе didReceiveData следующим образом:


    MainViewController *mainView = [[MainViewController alloc] initWithNibName:@"MainView" bundle:nil];
    AMEAppDelegate *delegate = [[UIApplication sharedApplication] delegate];
    [delegate.navController pushViewController:mainView animated:YES];
    mainView.labelStr.text = ReturnStr;

Еще одна проблема заключается в том, что данные в MainView будут перезаписаны, если я инициализирую MainView в «didReceiveData». Можно ли изменить текст labelStr без инициализации MainView?

Ответы [ 4 ]

2 голосов
/ 16 марта 2009

Проблема в том, что я обнаружил, что метод didReceiveData будет вызываться ПОСЛЕ метода, который вызывает соединение. (метод didReceiveData будет вызван после принятия команды IBAction)

Вы ожидаете, что соединение отправит вам connection:didReceiveData: до того, как вы его создадите и подключите?

Это вызовет проблему, заключающуюся в том, что если я хочу изменить текст метки на полученную строку, код не может быть записан в IBAction 'accept', но должен быть записан в методе didReceiveData ...

Звучит примерно так. Вы не можете работать с тем, что получили, пока не получили это.

Еще одна проблема заключается в том, что данные в MainView будут перезаписаны, если я инициализирую MainView в «didReceiveData». Можно ли изменить текст labelStr без инициализации MainView?

Создание контроллера основного представления и делегата приложения в вашем методе connection:didReceiveData: кажется действительно запоздалым, чтобы сделать это. Сделайте это раньше, затем сделайте connection:didReceiveData: ничего не делая, но установите labelStr.text.

Кстати, реализация connection:didReceiveData:, которую вы показываете утечки ReturnStr. Не забудьте освободить или автоматически выпустить то, что вы установили.

1 голос
/ 17 марта 2009

Если вы хотите, чтобы ваше приложение ожидало поступления данных, используйте метод NSURLConnection sendSynchronousRequest:returningResponse:error:. Однако обратите внимание, что остальная часть вашего приложения будет заморожена во время работы этого метода, и, конечно, этот метод может занять некоторое время, если у пользователя плохое соединение.

0 голосов
/ 22 февраля 2010

Использование NSMutableData вместо NSData.

0 голосов
/ 17 марта 2009

NSURLConnection и другие подобные классы предназначены для асинхронного использования.

initWithRequest: делегат: возвращается немедленно, и вы не раздражаетесь из-за соединения, пока оно не отправит методы делегата своему делегату.

...