Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Как заставить NSArrayController перезагрузить содержимое MOC, чтобы отразить последние свежие данные

Автор вопроса: Cullen SUNОтветов: 4

Я работаю над приложением для Mac и iOS с iCloud CoreData между ними для синхронизации данных.

Когда я обновляю что-то из приложения для iOS, обновления уже перенесены в PersistentStore в приложении для Mac во время работы приложения для Mac. Проблема в том, что я не могу найти эффективный способ заставить NSArrayController перезагрузить все данные из хранилища.

попробовал -(void) fetch:(id)sender; можно видеть только удаление или добавление объекта, но обновленное свойство модели не обновляется...

Пожалуйста помоги. Спасибо

  • Привет, я видел ваш комментарий к моему вопросу stackoverflow.com/questions/14010187/ и подумал, что лучше сообщить вам, что -setManagedObjectContext: работает только один раз в жизненном цикле приложения. Я попытался запустить его два раза подряд, и он завис. Todd 27.12.2012
  • Спасибо, Тодд. Я попытался и обнаружил, что это не сработало для моего случая... Я думаю, что обращусь за помощью к Apple... Cullen SUN 27.12.2012

macoscore-dataicloudcocoa-bindingsnsarraycontroller

Ответы

Ответ 1 · рейтинг 1 · Adam

Если вы видите последние данные в контексте управляемого объекта, но не в контроллере массива, вы хотите:

[_yourManagedObjectContext processPendingChanges];
[_yourArrayController fetchWithRequest:nil merge:YES error:&error];
[_yourArrayController rearrangeObjects];

Я использую это в приложении iCloud для Mac/iOS, чтобы обновлять данные приложения Mac при изменении магазина iCloud.

Ответ 2 · рейтинг 1 · Cullen SUN

Ниже приведен ответ службы технической поддержки разработчиков Apple. Это сработало для меня. Спасибо всем за предоставление решений.

Для приложения OS X при вызове reloadFetchResults вы можете попросить NSManagedObjectContext сбросить себя и снова выполнить выборку.

- (void)reloadFetchedResults:(NSNotification *)note
{
NSDictionary *userInfoDict = [note userInfo];

NSManagedObjectContext *moc = self.coreDataController.mainThreadContext;

// this only works if you used NSMainQueueConcurrencyType
// otherwise use a dispatch_async back to the main thread yourself
//
[moc performBlock:^{
    [self mergeiCloudChanges:userInfoDict forContext:moc];

    [moc reset];
    [self.tableArrayController fetch:self];
}];
}

Ответ 3 · рейтинг 1 · Todd

я нашел это

[self.managedObjectContext reset];
[myArrayController fetch:self];

заставляет мой NSTableView (с NSArrayController) повторно заполнять и отображать недавно обработанные NSManagedObjects.

Ответ 4 · Little Watchman

на случай, если кто-то еще обнаружит это... в моем случае я строил массив из взаимодействия с пользователем (не основных данных), а затем пытался показать tableView, когда они были сделаны (в том же окне)... и, конечно ... ничего не видя!

[Контроллер массива переупорядочитьОбъекты];

как раз перед тем, как я хотел показать, что tableView исправил это для меня.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы