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

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

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

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

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


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


Ответы (4)


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

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

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

person Adam    schedule 27.03.2013
comment
Спасибо, что поделились. Тем не менее, я решил проблему, в конце концов получив поддержку от Apple... Пожалуйста, смотрите мои ответы выше. Спасибо - person Cullen SUN; 27.03.2013
comment
Вы можете быть рады услышать, что ваш ответ (а НЕ ответ от Apple) решил проблему в моем случае... По какой-то причине мой (на основе Entity) NSArrayController выдавал исключения и не читал данные, пока я не fethWithRequest:nil merge:error: fetch:self ничего не делает в моем случае - и мне интересно, почему. - person Motti Shneor; 28.11.2020

Ниже приведен ответ службы технической поддержки разработчиков 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];
}];
}
person Cullen SUN    schedule 27.03.2013

я нашел это

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

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

person Todd    schedule 27.12.2012
comment
Хорошо, так что просто хватаюсь за соломинку, но я также обнаружил, что в моем случае я опускал NSPanel как лист над столом, пока он импортировал объекты. Кажется, это вызвало неисчислимый хаос в моем приложении. Я прибегал к отображению индикатора выполнения в другой части главного окна, подальше от стола. Похоже, это а) остановило некоторые случайные утверждения и б) заставило контроллер массива обновить и даже (!) уважать дескриптор сортировки. - person Todd; 03.01.2013
comment
простите, а кто здесь "я"? NSTableView? NSArrayController? какой-то подкласс вашего NSWindowController? - person Motti Shneor; 26.11.2020

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

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

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

person Little Watchman    schedule 01.09.2015