2013-11-10 4 views
1

Этот проект использует Mogenerator и Magical Record. Я обнаружил ошибку в том, что вызов awakeFromInsert происходит дважды. Один раз для каждого из моих контекстов я предполагаю. Это проблема, потому что мне нужно слушать NSNotifications на этом NSManagedObject, как это:awakeFromInsert, вызываемый дважды с вложенными контекстами

- (void)awakeFromInsert 
{ 
    // Listen for a return from background mode 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(enteringForeground:) name:UIApplicationWillEnterForegroundNotification object:nil]; 
} 

Но awakeFromInsert ПОЛУЧИТЬ называется дважды, который является довольно раздражающим. Я хочу вызвать метод ONCE, когда мой NSManagedObject будет сначала создан.

После поиска this solution seems to make a lot of sense. Однако я не вижу, как добавить категорию в NSManagedObject при использовании Mogenerator и MagicalRecord. Без какого-то сложного переопределения.

В MagicalRecord MR_createEntity звонки

if ([self respondsToSelector:@selector(insertInManagedObjectContext:)]) 
    { 
     id entity = [self performSelector:@selector(insertInManagedObjectContext:) withObject:context]; 
     return entity; 
    } 

Есть аккуратнее решение этой проблемы?

+1

Mogenerator создает два класса для каждой сущности, «машиной «класс и« человеческий »класс. Вы можете добавлять методы в «человеческий» класс, как вам нравится, без необходимости в категории. –

+0

Спасибо. Да, я уже это делаю. Я предполагаю, что проблема здесь в том, что мне нужен MagicalRecord для вызова моего нового метода, а не insertInManagedObjectContext, как показано выше. – JMWhittaker

+0

Я еще не понял связи между проблемой «awakeFromFetch дважды» и «insertInManagedObjectContext:» (что может быть моей ошибкой). - Но вы не можете переопределить 'insertInManagedObjectContext:' в классе «человек»? –

ответ

1

Хорошо, это очень хладнокровно, но, похоже, работает. Я создал следующие методы класса на моем читаемом классе NSManagedObject:

+ (id)insertInManagedObjectContext:(NSManagedObjectContext*)moc_ { 

    JWBoard *newobject = [super insertInManagedObjectContext:moc_]; 
    [JWBoard awakeFromCreate:newobject]; 
    return newobject; 
} 

+ (void)awakeFromCreate:(JWBoard *)board 
{ 
    // do setup stuff & add observers 
} 

Открыть в гораздо более эффективные решения!

+0

Спасибо за этот код - отлично работает до тех пор, пока вы также используете «insertInManagedObjectContext» MOGenerator. Мне пришлось искать мой проект и анализировать везде, где я использовал entityDescriptionForName, чтобы убедиться, что я не делал вставку не-MOGenerator. – stevesliva

0

Открыт для гораздо лучших решений!

Желаю! Было бы достаточно легко для яблока до не invoke awakeFromInsert, или, по крайней мере, предоставить флаг, который является истинным в контексте «parentProcessSaveRequest». Если вы посмотрите на стек вызовов для не-первых вызовов awakeFromInsert, стек всегда содержит parentProcessSaveRequest.

Вот некоторые ужасный код доказывает, как много:

- (void) awakeFromInsert 
{ 
    [super awakeFromInsert]; 

    NSArray* stackArray = [NSThread callStackSymbols]; 
    for (NSString* method in stackArray) 
    { 
     if ([method rangeOfString:@"_parentProcessSaveRequest"].location != NSNotFound) 
     { 
      NSLog(@"Parent insert %@",self.objectID); 
      return; 
     }   
    } 
    NSLog(@"First insert %@",self.objectID); 
    // Initialize here 

} 

И выход журнала - ObjectId остается прежним:

2014-05-19 20:53:52.964 myApp[1891:a01f] First insert 0x6000000326c0 <x-coredata:///MyEntity/t496E9B17-E170-4A7C-B7D4-7D8B92433E1C2> 
2014-05-19 20:53:53.531 myApp[1891:303] Parent insert 0xdca8000eb <x-coredata://7274869F-4BF3-4B8A-9270-A64E54476AAD/MyEntity/p14122> 
2014-05-19 20:53:53.537 myApp[1891:303] Parent insert 0xdca8000eb <x-coredata://7274869F-4BF3-4B8A-9270-A64E54476AAD/MyEntity/p14122> 

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

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

0

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

- (void)awakeFromInsert 
{ 

    if (!self.managedObjectContext.parentContext) { 
     //setting tableNumber 

     [self willChangeValueForKey:@"number"]; 
     [self setPrimitiveNumber:tableNumber]; 
     [self didChangeValueForKey:@"number"]; 
    } 

} 
Смежные вопросы