Как получить значения для объекта в didChangeObject: (id) anObject (NSfetchedResultsController)

Как я могу получить доступ к фактическим значениям объекта в этом методе делегата fetchedResultsController?

Я хотел бы установить раздел пути индекса для строк, которые нужно удалить / изменить в соответствии со значениями объекта, так как таблица имеет несколько источников данных

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
  atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
  newIndexPath:(NSIndexPath *)newIndexPath 
{
....get objects value, e.g. myEntity.city 
}

Теперь я знаю, что объект всегда будет относиться к классу myEntity (по крайней мере, в конечном счете, я не уверен, что именно означает «anObject»), но, очевидно, компилятор жалуется, когда я хочу установить экземпляр myEntity * anEntity = anObject;

Мой обходной путь заключался в том, чтобы поместить данные для каждого раздела в массивы и выполнить всю работу в tableView: commitEditingStyle: forRowAtIndexPath: где я знаю, какой раздел был вызван, и мне просто нужно получить доступ к indexpath.row. Недостатком является то, что я должен перезагружать массивы после каждого изменения и не могу напрямую работать с fetchedResultsController.

РЕДАКТИРОВАТЬ: принятый ответ работает нормально, этот ярлык, похоже, тоже работает для моей цели:

NSString *aString = [anObject valueForKey:@"city"]; 

person ceekay    schedule 21.05.2013    source источник
comment
myEntity * anEntity = (myEntity *) anObject;   -  person Wain    schedule 22.05.2013
comment
это действительно выглядит вполне разумно, не может запустить это немедленно, но похоже, что он должен работать, и мы с радостью примем его в качестве ответа. Приветствую за сверхбыстрый ответ!   -  person ceekay    schedule 22.05.2013
comment
@Wain: вы должны просто развернуть это в ответ. @wadi: вам просто нужно привести anObject к нужному типу (Entity), а затем использовать его как обычный экземпляр этого объекта. Некоторым людям нравится добавлять утверждения вроде NSAssert([anObject isKindOfClass:[Entity class]],…) или даже NSAssert(anObject == The_One_Object_I_Think_I'm_Observing, …)   -  person Aaron Golden    schedule 22.05.2013
comment
@AaronGolden ты меня убедил :)   -  person Wain    schedule 22.05.2013


Ответы (1)


Компилятор жалуется, но это всего лишь предупреждение, потому что вы не сказали ему, чего ожидать. Это так просто, как:

myEntity *anEntity = (myEntity *)anObject;

Тем не менее, вам нужно быть уверенным, что это правильный класс, поэтому стоит добавить небольшую защиту:

if ([anObject isKindOfClass:[myEntity class]) {
    myEntity *anEntity = (myEntity *)anObject;
    // do stuff
} else {
    NSLog(@"Panic / cry / plead");
}
person Wain    schedule 21.05.2013
comment
только что увидел в журналах, что то, что я пробовал раньше, тоже работает, имеет неправильные ключи, поэтому раньше не замечал: NSString * aString = [anObject valueForKey: @city]; - person ceekay; 22.05.2013