NSManagedObjectContextObjectsDidChangeNotification словарь пользовательской информации

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

- (void) awakeFromNib {
NSNotificationCenter *nc;
nc = [NSNotificationCenter defaultCenter];

[nc addObserver:self
       selector:@selector(syncKVO:)
           name:NSManagedObjectContextObjectsDidChangeNotification
         object:nil];
}

- (void)syncKVO:(id)sender {
NSNotificationCenter *nc;
nc = [NSNotificationCenter defaultCenter];
[nc removeObserver:self
              name:NSManagedObjectContextObjectsDidChangeNotification
            object:nil];

// Do stuff.

[nc addObserver:self
       selector:@selector(syncKVO:)
           name:NSManagedObjectContextObjectsDidChangeNotification
         object:nil];

}

Но я хотел бы проверить словарь userInfo, чтобы убедиться, что метод действительно должен быть запущен. Как мне это сделать?

Ответы на вопрос(1)

Решение Вопроса

документация заNSManagedObject дает вам ответ.

Уведомление имееттри метода экземпляра один из которых является-userInfo метод, который возвращает.userInfo dictionary

Похоже, ваш syncKVO: метод неверен; обработчики уведомлений должны принимать объект уведомления в качестве параметра.

документация для искомого уведомления отображаются ключи, которые находятся в этом словаре для этого уведомления, и вы можете использовать что-то вроде этого, чтобы получить то, что вам может понадобиться:

- (void)syncKVO:(NSNotification *)notification {
    NSDictionary *userInfoDictionary = [notification userInfo];
    NSSet *deletedObjects = [userInfoDictionary objectForKey:NSDeletedObjectsKey];

    // do what you want with the deleted objects
}
 Abizern04 нояб. 2009 г., 20:33
Да, спасибо. Я имел в виду, что если тыу вас есть дублированный код, вы действительно должны его реорганизовать.
 Abizern06 нояб. 2009 г., 20:12
Ну, смотреть видео с вашей отладкой нене поможет мне увидеть, чтоидет не так.
 Abizern02 нояб. 2009 г., 18:57
Помимо опечаток, это выглядит хорошо. Но сложнее всего то, что вы делаете с объектами.
 Joshua05 нояб. 2009 г., 17:58
Как вы его рефакторинг?
 Joshua07 нояб. 2009 г., 14:06
Спасибо за советы, я пробовал без просмотра уведомлений, и он отлично работает. Таким образом, проблема заключается в том, что это вызвано уведомлением.
 Joshua07 нояб. 2009 г., 12:36
Значит, после того, как оно изменилось, а не когда они меняются?
 Joshua10 нояб. 2009 г., 08:11
Это не будет работать, если уведомление было инициировано во время удаления. Но срабатывает ли уведомление во время удаления?
 Abizern02 нояб. 2009 г., 16:36
Лично ябуду проверятьif([deletedObjects count]) {…} Это неверно, если набор равен нулю или еслипусто
 Joshua03 нояб. 2009 г., 07:32
На данный момент я неНе нужно ничего делать с удаленными объектами.
 Joshua07 нояб. 2009 г., 08:49
Ну, я не могу найти проблему. Могу ли я спросить, когдаNSManagedObjectContextObjectsDidChangeNotification позвонить?
 Joshua02 нояб. 2009 г., 15:24
Спасибо, этот код будет работать, чтобы проверить, есть ли в NSSet объекты?gist.github.com/224185
 Joshua04 нояб. 2009 г., 20:01
Хорошо яПройду через все это в отладчике. Вот'это новый смысл кода, которыйс дублированными,gist.github.com/226293.
 Abizern03 нояб. 2009 г., 21:39
Тот'большой кусок кода, так что я не имеючитать все это; всего несколько баллов 1) ВыУ нас есть два метода, которые делают то же самое. 2) Ваш метод sync: назначает другой селектор для наблюдения из метода awakeFromNib. 3) Я подозреваю тебяВы по-прежнему наблюдаете свойство name ваших управляемых объектов, и эти изменения, вероятно, все еще вызывают срабатывание.
 Joshua06 нояб. 2009 г., 17:44
Все еще не повезло, яМы пытались отладить весь метод, объект добавляется в конце метода if. Вот's запись проблемы…  droplr.com/22Wes, Хотя это нене похоже, что он будет удален в первую очередь (потому что это неt исчезают), когда не отлаживается, похоже, что он исчезает и появляется снова. Может ли эта проблема быть из-за того, что NSManagedObjectContextObjectsDidChangeNotification вызывается во время удаления объекта, а не после его удаления?
 Abizern04 нояб. 2009 г., 19:52
Я нея знаю Вы'у нас так много дублированного кода, чтотрудно читать Вы'Мне просто нужно пройти через это в отладчике и посмотреть, что происходит.
 Joshua05 нояб. 2009 г., 19:08
Спасибо яЯ попробую это сделать. Я'мы немного отладили и заметили, что удаленный объект снова появляется в конце удаленного объекта метода if, похоже, что он по какой-то причине может перейти к следующему методу if. У меня нетя еще не закончил отладку, так что яЯ буду пытаться определить проблему.
 Joshua04 нояб. 2009 г., 17:15
Это был код, который я добавилsnapplr.com/gycp, это было там раньше, но дело в том, что это неОстановите повторное появление объекта. Вот's запись проблемыdroplr.com/20A7U, Это помогает? Я никогда не добавлял центр уведомлений в качестве наблюдателя для JGManagedObject, или он делает это автоматически?
 Joshua04 нояб. 2009 г., 07:44
Хорошо, я разделил его на 2 метода, так как только один получит уведомление. Я не'не замечаю, что он назначает другой селектор, яЯ изменим это сейчас, спасибо. Я'я наблюдаю, были ли какие-либо объекты удалены или обновлены, что в данном случае является именем, которое будет обновлено. Я думал, что остановил бы цикл, удалив наблюдателя в начале метода sync: и syncKVO: и затем добавив его снова в конце. Нет?
 Joshua08 нояб. 2009 г., 10:13
Есть идеи, почему это так?
 Abizern04 нояб. 2009 г., 10:46
Нету. Я нене знаю, что тымы добавили или изменили. Но здесь'ключ к разгадке; Все, что вы делаете, это удаляете себя из списка наблюдателей ваших конкретных уведомлений. Он все еще наблюдает за изменениями для ваших объектов JGManagedObject.
 Joshua03 нояб. 2009 г., 17:13
Спасибо, все исправлено. :)
 Abizern07 нояб. 2009 г., 10:55
Из документации уведомлениеРазмещается при изменении значений свойств объектов, содержащихся в контексте управляемого объекта.
 Abizern03 нояб. 2009 г., 11:31
Там'Еще одна опечатка. Взгляни на мою вилку твоей сути.
 Abizern05 нояб. 2009 г., 18:19
В этом случае вместо того, чтобы копировать и вставлять код в разные места, вы собираете его в одну функцию, а затем вызываете функцию. Облегчает чтение вашего кода и облегчает его изменение, потому что если вы изменяете что-то, вам нужно сделать это только в одном месте.
 Abizern04 нояб. 2009 г., 18:47
Так что'исчезают из календарного магазина и появляются в вашем приложении? В этом случае посмотрите, что вы делаете, чтобы синхронизировать элементы хранилища календаря обратно в ваше приложение.
 Joshua02 нояб. 2009 г., 18:03
Я вижу, так и сейчас.gist.github.com/224185
 Joshua03 нояб. 2009 г., 17:36
Хорошо, не могли бы вы помочь мне с последней вещью? Причина этого вопроса (как вы можете теперь) состоит в том, чтобы попытаться остановить мою проблему с бесконечным циклом. У меня все еще есть проблема даже со всем кодом, который ядобавим, на этот раз цикл запускается, как только я запускаю синхронизацию. Вот'Весь мой код связан с этим ... gist.github.com/225186, Почему это все еще происходит? Любая помощь очень ценится. Благодарю.
 Joshua04 нояб. 2009 г., 19:03
Предполагалось, что он будет удален из магазина календарей и оставлен в моем приложении. У меня проблема, потому что я добавляю объекты в свое приложение, прежде чем удалить их из хранилища календарей?
 Joshua04 нояб. 2009 г., 07:53
Ура! Исправляя эти селекторы, он останавливает цикл! Тем не менее, он должен в конце действия / метода удалить удаленный объект из iCal, однако он действительно удалил его из iCal, но вернулся в виде структуры, поэтому я добавил еще один код, чтобы снова удалить его из представления структуры. но это все еще возвращается, есть идеи, почему?
 Abizern07 нояб. 2009 г., 12:37
Ты нене спрашиваю, но здесьвсе равно несколько советов. 1 Ты неЧтобы поставить точку останова на каждой строке, вы можете поставить ее в верхней части функции, а затем использоватьостановиться или жешаг в кнопок. 2 Это'Недостаточно использовать отладчик, чтобы просто увидеть поток вашего кода, вы должны также проверять значения переменных. В вашем случае это может помочь, если вы наблюдаете за массивами, которые вы используете для синхронизации своего приложения и календаря. 3 Попробуйте настроить синхронизацию без просмотра уведомлений, а затем добавьте ее обратно.

Ваш ответ на вопрос