UITableView с NSFetchedResultsController не загружает второй раз

Обновление 3 Это журналы после первого запуска с пустым хранилищем данных.

2013-02-07 20:57:06.708 Five Hundred Things[14763:c07] mainMOC = <NSManagedObjectContext: 0x7475a90> 2013-02-07 20:57:06.711 Five Hundred Things[14763:1303] Import started 2013-02-07 20:57:06.712 Five Hundred Things[14763:1303] backgroundMOC = <NSManagedObjectContext: 0x8570070> 2013-02-07 20:57:06.717 Five Hundred Things[14763:c07] FRC fetch performed 2013-02-07 20:57:06.718 Five Hundred Things[14763:c07] numberOfSectionsInTableView returns 1 2013-02-07 20:57:06.720 Five Hundred Things[14763:c07] numberOfSectionsInTableView returns 1 2013-02-07 20:57:06.720 Five Hundred Things[14763:c07] numberOfRowsInSection returns 0 2013-02-07 20:57:06.728 Five Hundred Things[14763:1303] call contextDidSave 2013-02-07 20:57:06.736 Five Hundred Things[14763:1303] call contextDidSave 2013-02-07 20:57:06.736 Five Hundred Things[14763:c07] numberOfSectionsInTableView returns 1 2013-02-07 20:57:06.737 Five Hundred Things[14763:c07] numberOfSectionsInTableView returns 1 2013-02-07 20:57:06.737 Five Hundred Things[14763:c07] numberOfRowsInSection returns 5 2013-02-07 20:57:06.758 Five Hundred Things[14763:1303] call contextDidSave 2013-02-07 20:57:06.759 Five Hundred Things[14763:1303] Refresh complete 2013-02-07 20:57:06.759 Five Hundred Things[14763:c07] numberOfSectionsInTableView returns 1 2013-02-07 20:57:06.760 Five Hundred Things[14763:c07] numberOfSectionsInTableView returns 1 2013-02-07 20:57:06.761 Five Hundred Things[14763:c07] numberOfRowsInSection returns 5 

Обратите внимание, что выполняется выборка FRC, количество строк в этом разделе равно 0, но затем после второго contextDidSave оно изменяется на 5, чтобы соответствовать количеству категорий в хранилище данных.

На втором запуске с сбоем, вот журналы:

 2013-02-07 21:01:11.578 Five Hundred Things[14800:c07] mainMOC = <NSManagedObjectContext: 0x8225650> 2013-02-07 21:01:11.581 Five Hundred Things[14800:1303] Import started 2013-02-07 21:01:11.582 Five Hundred Things[14800:1303] backgroundMOC = <NSManagedObjectContext: 0x7439850> 2013-02-07 21:01:11.592 Five Hundred Things[14800:c07] FRC fetch performed 2013-02-07 21:01:11.594 Five Hundred Things[14800:c07] cat = Attraction 2013-02-07 21:01:11.594 Five Hundred Things[14800:c07] cat = Beverage 2013-02-07 21:01:11.595 Five Hundred Things[14800:c07] cat = Entertainment 2013-02-07 21:01:11.595 Five Hundred Things[14800:c07] cat = Hotel 2013-02-07 21:01:11.596 Five Hundred Things[14800:c07] cat = Restaurant 2013-02-07 21:01:11.597 Five Hundred Things[14800:c07] numberOfSectionsInTableView returns 1 2013-02-07 21:01:11.598 Five Hundred Things[14800:c07] numberOfSectionsInTableView returns 1 2013-02-07 21:01:11.599 Five Hundred Things[14800:c07] numberOfRowsInSection returns 0 2013-02-07 21:01:11.602 Five Hundred Things[14800:1303] call contextDidSave 2013-02-07 21:01:11.610 Five Hundred Things[14800:1303] call contextDidSave 

FRC инициализируется, и сразу же после этого Категории регистрируются, чтобы показать, что они действительно находятся в FRC. Однако количество строк в этом разделе равно 0 и никогда не обновляется. Вместо этого приложение падает со стеком ниже.

На третьем и последующих запусках это выглядит так:

 2013-02-07 21:03:55.560 Five Hundred Things[14815:c07] mainMOC = <NSManagedObjectContext: 0x8128860> 2013-02-07 21:03:55.563 Five Hundred Things[14815:1e03] Import started 2013-02-07 21:03:55.564 Five Hundred Things[14815:1e03] backgroundMOC = <NSManagedObjectContext: 0x822b5d0> 2013-02-07 21:03:55.569 Five Hundred Things[14815:c07] FRC fetch performed 2013-02-07 21:03:55.571 Five Hundred Things[14815:c07] cat = Attraction 2013-02-07 21:03:55.572 Five Hundred Things[14815:c07] cat = Beverage 2013-02-07 21:03:55.572 Five Hundred Things[14815:c07] cat = Entertainment 2013-02-07 21:03:55.573 Five Hundred Things[14815:c07] cat = Hotel 2013-02-07 21:03:55.573 Five Hundred Things[14815:c07] cat = Restaurant 2013-02-07 21:03:55.574 Five Hundred Things[14815:c07] numberOfSectionsInTableView returns 1 2013-02-07 21:03:55.576 Five Hundred Things[14815:c07] numberOfSectionsInTableView returns 1 2013-02-07 21:03:55.576 Five Hundred Things[14815:c07] numberOfRowsInSection returns 5 2013-02-07 21:03:55.581 Five Hundred Things[14815:1e03] call contextDidSave 2013-02-07 21:03:55.592 Five Hundred Things[14815:1e03] call contextDidSave 2013-02-07 21:03:55.593 Five Hundred Things[14815:c07] numberOfSectionsInTableView returns 1 2013-02-07 21:03:55.594 Five Hundred Things[14815:c07] numberOfSectionsInTableView returns 1 2013-02-07 21:03:55.595 Five Hundred Things[14815:c07] numberOfRowsInSection returns 5 2013-02-07 21:03:55.606 Five Hundred Things[14815:1e03] call contextDidSave 2013-02-07 21:03:55.606 Five Hundred Things[14815:1e03] Refresh complete 

Так должно выглядеть поведение во втором прогоне; данные уже находятся в хранилище, количество строк в секции возвращает 5, а категории отображаются в виде таблицы сразу.


Обновление 2 Вот трассировка стека основного потока, где происходит сбой. Поскольку это происходит в основном потоке, я думаю, что это имеет какое-то отношение к UITableView. Однако я не использую NSDictionary или NSMutableDictionary в UITableView. Теперь я numberOfRowsInSection что numberOfRowsInSection возвращающий 0 во втором запуске, вызывает проблему, но я не уверен, как ее разрешить. Он возвращает правильное число (5 с данными, которые я использую) в третьем прогоне и, кажется, правильно заполняет хранилище данных при первом запуске, поэтому я смущен тем, почему на втором запуске он возвращает 0 и не делает Не обновляйся.

 frame #0: 0x013ede52 libobjc.A.dylib`objc_exception_throw frame #1: 0x020330de CoreFoundation`-[__NSDictionaryM setObject:forKey:] + 158 frame #2: 0x01211d7a CoreData`-[NSFetchedResultsController(PrivateMethods) _preprocessUpdatedObjects:insertsInfo:deletesInfo:updatesInfo:sectionsWithDeletes:newSectionNames:treatAsRefreshes:] + 1994 frame #3: 0x01212ed7 CoreData`-[NSFetchedResultsController(PrivateMethods) _managedObjectContextDidChange:] + 2455 frame #4: 0x00b9e4f9 Foundation`__57-[NSNotificationCenter addObserver:selector:name:object:]_block_invoke_0 + 40 frame #5: 0x0200a0c5 CoreFoundation`___CFXNotificationPost_block_invoke_0 + 85 frame #6: 0x01f64efa CoreFoundation`_CFXNotificationPost + 2122 frame #7: 0x00ad2bb2 Foundation`-[NSNotificationCenter postNotificationName:object:userInfo:] + 98 frame #8: 0x01125163 CoreData`-[NSManagedObjectContext(_NSInternalNotificationHandling) _postObjectsDidChangeNotificationWithUserInfo:] + 83 frame #9: 0x011bed2f CoreData`-[NSManagedObjectContext(_NSInternalChangeProcessing) _createAndPostChangeNotification:withDeletions:withUpdates:withRefreshes:] + 367 frame #10: 0x01121128 CoreData`-[NSManagedObjectContext(_NSInternalChangeProcessing) _postRefreshedObjectsNotificationAndClearList] + 136 frame #11: 0x0111f8c0 CoreData`-[NSManagedObjectContext(_NSInternalChangeProcessing) _processRecentChanges:] + 80 frame #12: 0x0111f869 CoreData`-[NSManagedObjectContext processPendingChanges] + 41 frame #13: 0x010f3e38 CoreData`_performRunLoopAction + 280 frame #14: 0x01f78afe CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 30 frame #15: 0x01f78a3d CoreFoundation`__CFRunLoopDoObservers + 381 frame #16: 0x01f567c2 CoreFoundation`__CFRunLoopRun + 1106 frame #17: 0x01f55f44 CoreFoundation`CFRunLoopRunSpecific + 276 frame #18: 0x01f55e1b CoreFoundation`CFRunLoopRunInMode + 123 frame #19: 0x01f0a7e3 GraphicsServices`GSEventRunModal + 88 frame #20: 0x01f0a668 GraphicsServices`GSEventRun + 104 frame #21: 0x00021ffc UIKit`UIApplicationMain + 1211 frame #22: 0x000022dd Five Hundred Things`main(argc=1, argv=0xbffff31c) + 141 at main.m:16 frame #23: 0x00002205 Five Hundred Things`start + 53 

Обновление: мне удалось получить фактический сбой, а не просто ответ.

* Завершение приложения из-за неперехваченного исключения «NSInvalidArgumentException», причина: '* setObjectForKey: объект не может быть nil (ключ: _ContentChange_OldIndexPathKey)'

Этот вопрос SO является самым близким к ошибке, но в нем обсуждается значение, равное нулю вместо ключа. Похоже, что это происходит, когда Категории сохраняются в хранилище основных данных, но все категории имеют значения.

Сущность Category содержит category_id – Целое число 16 category_name – String

У этого есть много отношений с сущностью Thing, но эта конкретная часть кода ничего не делает с этими отношениями; он устанавливает только category_id и category_name. Позже в импорте (после сохранения MOC) речь идет о том, когда установлена ​​связь.

Код, о котором идет речь, из операции импорта:

 //import categories NSString *categoryPath = [[NSBundle mainBundle] pathForResource:@"category" ofType:@"json"]; NSData *categoryData = [NSData dataWithContentsOfFile:categoryPath]; NSDictionary *categoryResults = [NSJSONSerialization JSONObjectWithData:categoryData options:NSJSONReadingMutableLeaves error:&error]; NSEntityDescription *categoryEntity = [NSEntityDescription entityForName:@"Category" inManagedObjectContext:context]; NSMutableArray *categories = [[NSMutableArray alloc] init]; NSString *categoryPredicateString = [NSString stringWithFormat: @"category_id == $CATEGORY_ID"]; NSPredicate *categoryPredicate = [NSPredicate predicateWithFormat:categoryPredicateString]; for (NSDictionary *categoryKey in categoryResults){ NSFetchRequest *categoryFetchRequest = [[NSFetchRequest alloc] init]; [categoryFetchRequest setEntity:categoryEntity]; NSNumber *categoryID = [NSNumber numberWithInt:[[categoryKey objectForKey:@"category_id"] integerValue]]; [categories addObject:categoryID]; NSDictionary *categoryVariables = [NSDictionary dictionaryWithObject:categoryID forKey:@"CATEGORY_ID"]; NSPredicate *catSubPredicate = [categoryPredicate predicateWithSubstitutionVariables:categoryVariables]; [categoryFetchRequest setPredicate:catSubPredicate]; NSArray *categoryArray = [[NSArray alloc] init]; categoryArray = [context executeFetchRequest:categoryFetchRequest error:&error]; Category *categoryObject = [categoryArray lastObject]; NSNumber *categoryNum = [categoryObject valueForKey:@"category_id"]; NSInteger categoryInt = [categoryNum integerValue]; if (categoryInt != [[categoryKey objectForKey:@"category_id"] integerValue]){ categoryObject = [NSEntityDescription insertNewObjectForEntityForName:@"Category" inManagedObjectContext:context]; categoryObject.category_id = [NSNumber numberWithInt:[[categoryKey objectForKey:@"category_id"] intValue]]; } if (categoryObject.category_name != [categoryKey objectForKey:@"category"]){ categoryObject.category_name = [categoryKey objectForKey:@"category"]; } } //Remove unneeded Categories from Core Data Store NSFetchRequest *removeUnusedCategories = [[NSFetchRequest alloc] init]; [removeUnusedCategories setEntity:categoryEntity]; NSArray *fetchedCategories = [context executeFetchRequest:removeUnusedCategories error:&error]; for (Category *fetchedCategory in fetchedCategories){ if (![categories containsObject:fetchedCategory.category_id]){ [context deleteObject:fetchedCategory]; NSLog(@"Object deleted"); } } if (![context save:&error]) { NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]); } 

[context save] происходит на фоне MOC и синхронизируется с основным MOC (в делегате приложения) через центр уведомлений. Он прослушивает NSManagedObjectContextDidSaveNotification и запускает mergeChangesFromContextDidSaveNotification: на главном MOC.

Первый запуск и третий запуск работают отлично. Это всегда происходит во втором прогоне.


Я использую Core Data в проекте iOS, и пока он работает хорошо, за исключением одной проблемы.

Приложение заполняет хранилище основных данных из файлов JSON, а начальный UITableViewController загружает анимацию по своему усмотрению. Однако во второй раз, когда приложение запускается, исходный UITableView пуст. Я проверил несколько мест, и данные находятся в хранилище основных данных, когда начинается второй запуск, но не вызывается ни один из методов UITableView или NSFetchedResultsController.

При первом запуске количество строк в секции возвращает 0, но после загрузки хранилища Core Data возвращает 5 как следует. При втором запуске количество строк в секции (только одна секция) возвращает 0 и не обновляется. На третьем и все последующем запуске количество строк в секции возвращает 5, как следует.

На втором запуске приложения не didChangeObject метод didChangeObject UITableView или методы didChangeObject didChangeObject . UITableViewController – это UITableViewDelegate , UITableViewDataSource и NSFetchedResultsControllerDelegate .

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

Чтобы воспроизвести, я удаляю приложение из симулятора, запускаю один раз, и база данных заполняется, и приложение отображается правильно. Я останавливаю приложение и снова запускаю, и ничего не отображается. Я останавливаю приложение и запускаю его в третий раз, и он отображается правильно.

Все это, похоже, работает правильно, за исключением второго запуска приложения. Первый и третий раз работают правильно. Что мне не хватает?

Что касается моего кода, я не уверен, что здесь делать. Начнем с реализации UITableViewController.

 @implementation FTWTMasterViewController @synthesize managedObjectContext; @synthesize categoryController = _categoryController; @synthesize catLocViewController; - (id)initWithStyle:(UITableViewStyle)style { self = [super initWithStyle:style]; if (self) { // Custom initialization } return self; } - (NSFetchedResultsController *)categoryController { if (_categoryController != nil) { return _categoryController; } NSLog(@"tableview MOC = %@", self.managedObjectContext); NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescription entityForName:@"Category" inManagedObjectContext:self.managedObjectContext]; [fetchRequest setEntity:entity]; NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"category_name" ascending:YES]; [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]]; [fetchRequest setFetchBatchSize:20]; NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:@"CategoryTable"]; _categoryController = theFetchedResultsController; _categoryController.delegate = self; return _categoryController; } - (void)viewDidLoad { [super viewDidLoad]; self.tableView.dataSource = self; self.tableView.delegate = self; NSError *error; if (![[self categoryController] performFetch:&error]) { // Update to handle the error appropriately. NSLog(@"Unresolved error %@, %@", error, [error userInfo]); exit(-1); // Fail } NSLog(@"Fetch called"); self.title = @"Categories"; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } #pragma mark - Table view data source - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { NSLog(@"number of sections = %lu", (unsigned long)[[self.categoryController sections] count]); return [[self.categoryController sections] count]; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { id sectionInfo = [[_categoryController sections] objectAtIndex:section]; NSLog(@"numberOfObjects = %lu", (unsigned long)[sectionInfo numberOfObjects]); return [sectionInfo numberOfObjects]; } - (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath { Category *category = [_categoryController objectAtIndexPath:indexPath]; cell.textLabel.text = category.category_name; NSLog(@"config cell %@", category.category_name); } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { NSLog(@"tableView setup"); static NSString *CellIdentifier = @"categoryCell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; // Set up the cell... [self configureCell:cell atIndexPath:indexPath]; return cell; } #pragma mark - Table view delegate - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { Category *aCategory = [self.categoryController objectAtIndexPath:indexPath]; if (self.catLocViewController == nil){ FTWTCatLocationViewController *aCatLocController = [[FTWTCatLocationViewController alloc] init]; self.catLocViewController = aCatLocController; } self.catLocViewController.selectedCat = aCategory; aCategory = nil; self.catLocViewController.managedObjectContext = self.managedObjectContext; [self.navigationController pushViewController:self.catLocViewController animated:YES]; self.catLocViewController = nil; } #pragma mark - Fetched results controller delegate - (void)controllerWillChangeContent:(NSFetchedResultsController *)controller { // The fetch controller is about to start sending change notifications, so prepare the table view for updates. [self.tableView beginUpdates]; } - (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath { NSLog(@"didChangeObject"); UITableView *tableView = self.tableView; switch(type) { case NSFetchedResultsChangeInsert: [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade]; break; case NSFetchedResultsChangeDelete: [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; break; case NSFetchedResultsChangeUpdate: [self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath]; break; case NSFetchedResultsChangeMove: [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade]; break; } } - (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id )sectionInfo atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type { switch(type) { case NSFetchedResultsChangeInsert: [self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade]; break; case NSFetchedResultsChangeDelete: [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade]; break; } } - (void)controllerDidChangeContent:(NSFetchedResultsController *)controller { // The fetch controller has sent all current change notifications, so tell the table view to process all updates. [self.tableView endUpdates]; } @end 

2 Solutions collect form web for “UITableView с NSFetchedResultsController не загружает второй раз”

В отличие от того, что я предположил в приведенном выше комментарии, такой же эффект может произойти, если для создания секций таблиц (если я могу воспроизвести это с помощью тестовой программы) указан параметр sectionNameKeyPath .

Когда приложение запускается в первый раз, происходит следующее:

  1. Создается постоянный файл хранилища «appname.sqlite».
  2. Созданный контролер результатов для представления таблицы создается с помощью cacheName параметров cacheName , так что создается файл кэша секций. На этом этапе все секции пусты.
  3. Создается фоновый MOC, который считывает некоторые данные JSON из файла ресурсов и добавляет объекты в контекст.
  4. Фоновый MOC сохраняется.

(Кстати, кэш-файл

  Library/Caches/<bundle-id>/.CoreDataCaches/SectionInfoCaches/<tablename>/sectionInfo 

в комплекте приложений.)

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

Теперь интересная часть: если (в первом запуске) создание файла хранилища (шаг 1) и сохранение обновленного контекста (шаг 4) происходит в одну секунду , то дата изменения файла хранилища не изменяется на этапе 4 !!

Поэтому файл кэша раздела по-прежнему считается действительным и не воссоздается . Поскольку все секции были пустыми (на шаге 2), FRC использует эту кэшированную информацию и отображает только пустые разделы.

Фоновый MOC снова запускается и сохраняет контекст. Теперь файл хранилища имеет новую дату изменения, поэтому разделы и строки отображаются правильно в третьем запуске приложения.

Чтобы подтвердить мою «теорию», я сделал ручное «касание» файла хранилища между первым и вторым прогоном для обеспечения изменения даты изменения. Затем все разделы и строки отображались правильно.

(Я тестировал это только в iPhone Simulator.Я не знаю, имеет ли файловая система HFS + разрешение на 1 секунду даты модификации, или если SQLite делает что-то особенное здесь. Я попытаюсь изучить это позже.)

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

Я столкнулся с той же проблемой. Когда я загрузил данные, первая загрузка была прекрасной. Когда я перезапустил приложение, данные исчезли из таблицы. Это были мои соображения:

self.fetchedResultsController.fetchedObjects : 8
[self.fetchedResultsController.sections count] : 1
[self.fetchedResultsController.sections[0] numberOfObjects] : 0

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

призвание

 [NSFetchedResultsController deleteCacheWithName:nil]; 

удалит все кеши.

Я также решил не кэшировать сейчас. Я не думаю, что буду хранить десятки тысяч записей в моей базе данных для этих таблиц, поэтому я не уверен, что кеширование улучшит что-либо. Установка cacheName в nil предотвратит любое кэширование NSFetchedResultsController .

 self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.context sectionNameKeyPath:sectionIdentifier cacheName:nil]; 
  • Core Data не реагирует на измененный предикат
  • NSRangeException ', причина:' *** - : индекс 2 за пределами границ ошибка с CoreData и NSFRC
  • Должен ли я вручную сохранять файл managedObjectContext для NSFetchedResultsController, если я изменяю какой-либо атрибут?
  • NSFetchResultsController -controllerDidChangeContent: - Попытка создать две анимации для ячейки с userInfo
  • Добавить дополнительную строку в UITableView, управляемую NSFetchedResultsController
  • почему массив FetchedObjects NSFetchedResultsController не всегда однородный
  • Ограничение отображаемых результатов с помощью NSFetchedResultsController и UITableView (Swift)
  • NSFetchedResultsController не вызывает контроллерDidChangeContent: после обновления до непринятого NSManagedObject
  • Основные данные. Как получить объект с максимальным значением.
  • Индексированные NSFetchedResultsController
  • Удалить в NSFetchedResultsController не сохраняется до перезагрузки
  • PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.