У меня проблема с тем, что 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];
}
ТНХ