在RestKit EntityMapping更新之后,NSFetchedResultsController不读取CoreData实体中更新的派生值

 峰的紫色摩天轮 发布于 2023-01-07 11:52

我有一个视图控制器,我在其中创建一个NSFetchedResultsController以在TableView中显示一组CoreData对象.在tableview中查看这些对象时,可以通过调用RestKit getObjectsAtPath来更新它们,它通过响应描述符和RKEntityMapping正确处理,以更新CoreData对象上的字段.但是,此特定实体还具有自定义派生字段 - 实际上是状态机(基于TransitionKit),它读取提供给实体的状态值,并使用服务器提供的状态重新初始化状态机.但是,无论我在哪里重新初始化状态机(awakeFromFetch,willSave,键值观察),当NSFetchedResultsController中的对象副本用于更新相应的表格单元格时(NSFetchResultsController为)时,不会更新此重新初始化状态机.通知该行的变化).要清楚 - 通过RestKit EntityMapping IS更新的值已更新,但状态机(派生值)未更新.这是为什么?

不应该以允许它们计算派生值的方式通知NSFetchedResultsController的对象数组吗?当我在代码中跟踪时,主线程中的awakeFromFetch还没有包含更新的值,并且在willSave或setter中计算我的派生值似乎不会在NSFetchedResultsController持有的对象的实例中创建此派生值.

我已附上我的基本型号代码

#import "VCStateMachineManagedObject.h"

@interface VCStateMachineManagedObject ()

@property (nonatomic, strong) TKStateMachine * stateMachine;

@end



@implementation VCStateMachineManagedObject

@dynamic savedState;
@synthesize stateMachine = _stateMachine;
@synthesize forcedState;

-(id)init {
    self = [super init];
    if(self != nil) {
    }
    return self;
}


- (BOOL)canFireEvent:(id)eventOrEventName {
    return [_stateMachine canFireEvent:eventOrEventName];
}

- (BOOL)fireEvent:(id)eventOrEventName userInfo:(NSDictionary *)userInfo error:(NSError **)error{
   return [_stateMachine fireEvent:eventOrEventName userInfo:userInfo error:error];
}

- (void) assignStatesAndEvents:(TKStateMachine *) stateMachine {
    [NSException raise:@"Invoked abstract method" format:@"Invoked abstract method"];
}

- (NSString *) getInitialState {
    [NSException raise:@"Invoked abstract method" format:@"Invoked abstract method"];
    return nil;
}


- (void)awakeFromInsert {
    if(self.savedState == nil){
        self.savedState = [self getInitialState];
    }
    [self createStateMachine];
}

- (void)awakeFromFetch {
    if(self.savedState == nil){
        self.savedState = [self getInitialState];
    }
    [self addObserver:self forKeyPath:@"savedState" options:NSKeyValueObservingOptionNew context:nil];
    [self createStateMachine];
}


- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    if(![[_stateMachine.currentState name] isEqualToString:self.savedState]){
        [self createStateMachine];
    }
}

- (void) willSave {
    NSLog(@"%@", self.savedState);
    [self createStateMachine];
}


// Manually set the state, for restkit object mapping
- (void) setForcedState: (NSString*) state__ {
    self.savedState = state__;
}

- (void) setSavedState:(NSString *)savedState__{
    [self willChangeValueForKey:@"savedState"];
    [self setPrimitiveValue:savedState__ forKey:@"savedState"];
    [self didChangeValueForKey:@"savedState"];
    [self createStateMachine];
}

- (NSString *) state {
    NSString * state = [_stateMachine.currentState name];
    return [NSString stringWithFormat:@"%@ %@", state, self.savedState];
}


#pragma mark - State Machine

- (void)prepareStateMachine {
    for(TKEvent * event in _stateMachine.events){
        [event setDidFireEventBlock:^(TKEvent *event, TKTransition *transition) {
            self.savedState = transition.destinationState.name;
        }];
    }
}

- (void) createStateMachine {
    _stateMachine = [TKStateMachine new];
    [self assignStatesAndEvents:_stateMachine];
    [self prepareStateMachine];
    _stateMachine.initialState = [_stateMachine stateNamed:self.savedState];
    [_stateMachine activate];
}


@end

@quellish这是我在托管对象中跟踪断点时看到的内容.

    我呼吁restkit下载新对象

    Restkit在后台线程(不是主线程)中下载对象.我看到它找到匹配的对象(awakeFromFetch),更新状态(setForcedState)和save(willSave),并且在对象的这个实例上我看到多次调用的createStateMachine方法(这是因为我在所有这些函数中都有它,虽然这当然对NSFetchedResultsController中的实例没有影响.

    然后我看到主线程上的一个对象被获取(awakeFromFetch)并经历相同的过程.

    然后我看到主线程上的一个对象被KVO触发并再次通过createStateMachine方法.

在我查看状态机中的变量的所有原因中,它们已更新为正确的值.但是,当NSFetchedResultsController触发更改时,状态机即使值本身也不会更新.

在接下来的几个小时内,我将追溯到这一点,并提供有关我所看到的行为的更具体信息.我还要为实体的每个实例添加一个UUID,以确保正在更新的实例实际上是NSFetchedResultsController中的实例.敬请关注.

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有