我有一个视图控制器,我在其中创建一个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中的实例.敬请关注.