Обновить отсортированное представление таблицы после обновления основных данных

#ios #iphone #uitableview #sorting #core-data

#iOS #iPhone #uitableview #сортировка #core-data

Вопрос:

Я заполняю свой tableview из core data. Строки сортируются в соответствии с первичным и вторичным ключами. Метод viewDidLoad содержит код запроса MOC и выборки.

Пользователи могут обновлять строку в tableview с помощью другого представления, и данные быстро обновляются при отображении. Однако отображаемые данные теперь не в правильном порядке сортировки.

Моя проблема в том, как мне отсортировать данные и отобразить их соответствующим образом? Должен ли я снова вызвать метод viewDidLoad для повторной выборки данных, а затем перезагрузить tableview? Каков наилучший способ сделать это? Если я должен вызвать метод viewDidLoad, где это должно быть сделано?

Мой код показан ниже:

 - (void)viewDidLoad
  

{
[super viewDidLoad];

 NSManagedObjectContext *managedObjectContext = [self managedObjectContext];

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"MonitorItem"];
[fetchRequest setSortDescriptors:[NSArray arrayWithObjects:
                                  [[NSSortDescriptor alloc] initWithKey:@"show"
                                                               ascending:NO],
                                  [[NSSortDescriptor alloc] initWithKey:@"expiry"
                                                              ascending:YES], nil]];

self.monitorItemArray = [[managedObjectContext
                          executeFetchRequest:fetchRequest
                          error:nil] mutableCopy];
  

}

Комментарии:

1. Используете ли вы NSFetchedResultsController ?

2. Нет, я этого не делаю. Можете ли вы показать мне, как это сделать?

3. Нет. Но вы можете найти много информации на веб-сайте разработчика Apple.

4. Собственный шаблон проекта Xcode от Apple для приложения Master-Detail с установленным флажком core data использует контроллер NSFetchedResultsController.

5. Я проверил все ссылки и не понимаю, как это реализовать. Я новичок и до сих пор многого не понимаю. Возможно, то, что говорит @fgeorgiew, верно. Я сохранил объекты в массиве. Метод viewDidLoad добавлен выше. Я посмотрю на KVO. Спасибо.

Ответ №1:

Если вы не используете fetchedResultsController, то, скорее всего, вы храните объекты в какой-либо коллекции. Затем вы можете добавить observer (KVO — KeyValueObserving) в эту коллекцию, чтобы получать уведомления, когда что-то меняется в ее объектах. Затем вы можете обработать этот ответ и вызвать [tableView reloadData];

Чего вам не следует делать, так это вызывать viewDidLoad: самостоятельно. Если вы все еще думаете об этом, вам лучше поместить код инициализации вашего представления в отдельный метод, который вызывается в viewDidLoad: , и затем вы также можете использовать его, когда вам это нужно.