connectionDidFinishLoading вызывается до того, как connectionDidReceiveData получил все данные? - PullRequest
1 голос
/ 18 февраля 2011

У меня проблема с тем, что connectionDidFinishLoading уведомляется до того, как connectionDidReceiveData получил и обработал все данные. Проблема возникает, потому что я пытаюсь обработать данные по мере их поступления и обновить таблицу. Я думаю, что эта обработка замедляет работу, и в результате, прежде чем я обработал ВСЕ, вызывается data connectionDidFinishLoading, и в результате я, кажется, всегда упускаю последние 10-15% данных.

Согласно документам Apple, в нем говорится, что делегат не будет получать больше вызовов после вызова connectionDidFinishLoading. Возможно ли, что connectionDidReceiveData не отправляет все данные, потому что требуется много времени для обработки части данных, а затем вызывается connectionDidFinishLoading, и впоследствии connectionDidReceiveData не вызывается снова с конечными частями данных?

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

Вот схема кода, хотя я удалил код обработки, так как он немного длинный и грязный.

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)newData {

if (!self.data) {
    self.data = [[[NSMutableData alloc] init] autorelease];
    NSLog(@"data is null");
}
else {
    [self.data appendData:newData];
    [self processSearchResultsForData:self.data];
}

Вот метод, который обрабатывает данные

-(void)processSearchResultsForData:(NSMutableData*)newData
{

NSString *newHtmlText = [[NSString alloc] initWithBytes:newData.bytes length:newData.length encoding:NSISOLatin1StringEncoding];

// process new data and create an array newResults with results         

// only update results array with new data if results were found
if ([newResults count] > 0) {       
    self.resultsArray = newResults;
    [self updateTableWithResults];

}
}

Этот метод обновляет tableView

-(void)updateTableWithResults
{
    // do a lot more processing here    
    // then set results array as table data source
    [self.tableView reloadData];            
}

ТНХ

...