Мгновенное обновление табличного представления при загрузке данных в основные данные iphone - PullRequest
0 голосов
/ 12 мая 2010

Мне нужно обновить представление таблицы, как только содержимое будет передано в базу данных основных данных.

за это AppDelegate.m содержит следующий код

NSManagedObjectContext *moc = [self managedObjectContext];
NSFetchRequest *request = [[NSFetchRequest alloc] init];

[request setEntity:[NSEntityDescription entityForName:@"FeedItem" inManagedObjectContext:moc]];
//for loop
// push data in code data & then save context  
[moc save:&error];

ZAssert(error == nil, @"Error saving context: %@", [error localizedDescription]);
//for loop ends 

Этот код запускает следующий код из RootviewController.m

- (void)controllerWillChangeContent:(NSFetchedResultsController*)controller 
{
[[self tableView] beginUpdates];
}

Но это обновляет представление таблицы только в конце цикла for, таблица не обновляется после немедленного добавления в БД.

Я попробовал следующий код, но это не сработало

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
// In the simplest, most efficient, case, reload the table view.
[self.tableView reloadData];
}

Я застрял с этой проблемой в течение нескольких дней. Пожалуйста, помогите. Заранее спасибо за решение.

1 Ответ

0 голосов
/ 12 мая 2010

Похоже, вы запускаете первый бит кода в основном потоке. Поскольку этот поток также контролирует обновление пользовательского интерфейса, ничего не произойдет, пока ваш цикл не будет завершен. Есть три способа решить эту проблему.

1) Обновите coredata из второго потока и передайте сообщение в основной поток, чтобы сообщить ему об обновлении пользовательского интерфейса. Это довольно сложно сделать - посмотрите на документы о многопоточности основных данных для некоторых страшных предупреждений!

2) Не делайте обновления в цикле for, вместо этого делайте это как часть таймера. это даст пользователю время для обновления между каждой вставкой, т.е.

    ...
    self.stuffToUpdate = [NSMutableArray arrayWithObjects:...];
    [NSTimer scheduledTimerWithInterval:0.1 target:self selector:@selector(doStuff:) userInfo:nil repeats:YES];
    ...

- (void) doStuff:(NSTimer *)timer {
    // If there's noting to update, bail
    if (0 == stuffToUpdate.count) {
        [timer invalidate];
        return;
    }

    // Get the next object to update
    id object = [stuffToUpdate objectAtIndex:stuffToUpdate.count-1];
    [stuffToUpdate removeLastObject];

    // Do stuff to object
    [object doStuff];

    // Save
    NSError &error = nil;
    [moc save:&error];

    // Tell the table to update
    [self.tableView reloadData];
}

Однако такая постоянно обновляемая таблица может вызывать странные проблемы с пользовательским интерфейсом - вам придется попробовать ее в пользовательских тестах, чтобы убедиться, что она работает нормально. Кроме того, это замедлит общее время, затрачиваемое на обновление coredata, но это может не быть проблемой, если вы все время обновляете пользовательский интерфейс.

3) Измените свое приложение так, чтобы оно отображало сообщение «Пожалуйста, подождите» с индикатором активности, пока заполненные данные заполнены! Это гораздо проще сделать, но если ваши обновления занимают много времени, это может оттолкнуть пользователей.

...