我在核心数据中有两个实体(见下文),并使用NSFetchedResultsController
和[NSPredicate predicateWithFormat:@"calendar.subscribed == 1"];
来提取"事件"对象
日历
事件
一切正常,但如果我更改某些"日历"的subscribed
属性并将上下文保存在其他线程中,controllerDidChangeContent
未被调用。
我可以强制重新获取吗?怎么样?
答案 0 :(得分:0)
可悲的是,FRC仅监视作为获取主题的对象(在您的情况下为Event
)。因此,它无法识别对相关对象属性的更改,即使这些更改可能会影响谓词的计算方式。
当您更改Calendar
对象的属性值时,一种解决方法(如果您可以使用性能命中)是将关联的Event
对象上的值更改为其现有值值 - 理论上没有变化,但足以触发FRC重新评估Event
的谓词。
答案 1 :(得分:0)
正如在另一个答案中所提到的,NSFetchedResultsController只会获取对Event对象而不是Calendar的更改。要强制刷新,您可以在调用' saveContext'后立即更新日历的订阅状态时发布NSNotification:
[[NSNotificationCenter defaultCenter] postNotificationName:@"calendarSubscriptionUpdated" object:nil];
然后在要更新的类中添加一个观察者:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateEventData:) name:@"calendarSubscriptionUpdated" object:nil];
填充' updateEventData' (或者你想要的任何东西)方法用代码来运行fetch,你应该很高兴。
答案 2 :(得分:0)
您可以将观察者添加到事件
中的Calendar.subscribed-(void)awakeFromFetch {
[ self addObserver:self
forKeyPath:@"calendar.subscribed"
options:NSKeyValueObservingOptionNew
context:NULL ];
}
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context {
if ([keyPath isEqualToString:@"calendar.subscribed"]) {
[ self willChangeValueForKey:@"anyProperty" ];
[ self didChangeValueForKey:@"anyProperty" ];
}
}
-(void)willTurnIntoFault {
[ super willTurnIntoFault];
[ self removeObserver:self forKeyPath:@"calendar.subscribed" ];
}
而不是“anyProperty”使用不动产的事件名称。在它工作之前我使用了相同的方法。