Похоже, вы запускаете первый бит кода в основном потоке. Поскольку этот поток также контролирует обновление пользовательского интерфейса, ничего не произойдет, пока ваш цикл не будет завершен. Есть три способа решить эту проблему.
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) Измените свое приложение так, чтобы оно отображало сообщение «Пожалуйста, подождите» с индикатором активности, пока заполненные данные заполнены! Это гораздо проще сделать, но если ваши обновления занимают много времени, это может оттолкнуть пользователей.