使用嵌套上下文调用awakeFromInsert两次

时间:2013-11-10 19:00:20

标签: objective-c core-data mogenerator magicalrecord-2.1

该项目使用Mogenerator和Magical Record。我已经找到了awakeFromInsert被调用两次这一事实的错误。对于我的每一个背景,我都假设一次。这是一个问题,因为我需要在这个NSManagedObject上监听NSNotifications,如下所示:

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

但awakeFromInsert被叫两次,这很烦人。我想在第一次创建NSManagedObject时调用ONCE方法。

搜索this solution seems to make a lot of sense后。但是,在使用Mogenerator和MagicalRecord时,我无法看到如何在NSManagedObject上添加类别。没有一些复杂的重写。

在MagicalRecord中MR_createEntity来电

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

这个问题是否有更简洁的解决方案?

3 个答案:

答案 0 :(得分:2)

好吧,这感觉非常hacky但似乎工作。我在人类可读的NSManagedObject类上创建了以下类方法:

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

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

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

开放更好的解决方案!

答案 1 :(得分:0)

  

开放更好的解决方案!

我希望!本来很容易让苹果调用awakeFromInsert,或者至少在“parentProcessSaveRequest”的上下文中提供一个真实的标志。如果您查看调用堆栈以查看对{​​{1}}的非首次调用,则堆栈始终包含awakeFromInsert

这里有一些 可怕的 代码证明了这一点:

parentProcessSaveRequest

日志输出 - objectId保持不变:

- (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

}

似乎可以保存到我拥有的任何嵌套上下文中,但实际上很难看。

不幸的是,我无法用任何合理的方法来确定是否在parentProcessSaveRequest的上下文中调用了awakeFromInsert。来吧,Apple!在这里给我们一面旗帜。

答案 2 :(得分:0)

这是最简单的一个: 当parentContext为null时,表示保存此上下文时,您可以自定义逻辑,例如递增表号

- (void)awakeFromInsert
 {

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

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

 }