#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:
, и затем вы также можете использовать его, когда вам это нужно.