UITableView с огромными (вероятно, 1 миллион записей) данными в iphone - PullRequest
2 голосов
/ 05 марта 2012

Я занимаюсь разработкой приложения, которое требует загрузки более 1 миллиона записей посредством бесконечной прокрутки в виде таблицы.Каждый раз будет отправляться запрос на 1000 записей, и после загрузки и анализа данных через библиотеку JSON таблица перезагружается.Я реализовал это через CoreData с "setFetchBatchSize = 1000".

StreamModal *modal = [[StreamModal alloc]init];
              StreamModal *modal = [NSEntityDescription insertNewObjectForEntityForName:@"StreamModal" inManagedObjectContext:managedObjectContext];
                 if([self isNotNull:[streamDataDict objectForKey:@"_id"]])
                     modal.stream_id               = [streamDataDict objectForKey:@"_id"];

-(void)reloaData{
@try {
    NSError *error;
    if (![[self fetchedResultsController] performFetch:&error]) {
        // Update to handle the error appropriately.
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        exit(-1);  // Fail
    }
    NSLog(@"ferchresults count %d",[[_fetchedResultsController fetchedObjects]count]);
}
@catch (NSException *exception) {
    NSLog(@"exception raised in reloadData in streamViewController class %@",exception);
}
@finally {

}
}


- (NSFetchedResultsController *)fetchedResultsController {

if (_fetchedResultsController != nil) {
    return _fetchedResultsController;
}

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"StreamModal" inManagedObjectContext:appDelegate.managedObjectContext];
[fetchRequest setEntity:entity];

NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:NO];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];

[fetchRequest setFetchBatchSize:1000];
//[fetchRequest setFetchLimit:2000];

NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:appDelegate.managedObjectContext sectionNameKeyPath:nil cacheName:nil];
self.fetchedResultsController = theFetchedResultsController;
_fetchedResultsController.delegate = self;

fetchRequest = nil;
theFetchedResultsController = nil;

return _fetchedResultsController;    

}

Вот код, который я использую, когда, когда соединение завершается, я загружаю данные в класс NSManagedObject (StreamModal), а затем вызываю данные перезагрузки. Вот проблема в том, что приложение получает исключения памяти после того, как язагрузил 12000 записей в таблицу и потерпел крах.Как я могу загрузить все записи без исключения памяти.Я новичок в концепции CoreData и прочитал основные концепции данных через руководство разработчика, но я не нашел никакой информации, связанной с обработкой памяти.Пожалуйста, помогите мне.

Ответы [ 2 ]

1 голос
/ 05 марта 2012

Надеюсь, вы используете ARC?Потому что вы не выпускаете никаких инициализированных объектов.(Если нет, то это ваш ответ.)

Но в любом случае: пытались ли вы использовать инструменты, чтобы увидеть, какие объекты увеличивают объем памяти?Это было бы хорошей отправной точкой.

0 голосов
/ 06 марта 2012

shiva inturi,

Во-первых, я хочу повторить другие комментарии о том, что работа с одним представлением таблицы из миллиона элементов - это действительно плохой пользовательский опыт.*

Что вы делаете, когда приходит предупреждение о памяти?

Как минимум, вы должны пройти через массив объектов и обрезать граф объектов.Это сделано с -refreshObject:mergeChanges:.Вы также должны позаботиться о том, чтобы не пересекать ваш массив очень далеко.Я бы начал с ваших видимых объектов и работал бы как вперед, так и вперед, пока вы не начали наносить удары по неисправным объектам, проверяя с помощью -isFault.

Andrew

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