核心数据NSPredicate的关系在[上下文保存]之后不起作用

时间:2015-06-12 16:13:48

标签: ios objective-c core-data nsfetchedresultscontroller

我在核心数据中有两个实体(见下文),并使用NSFetchedResultsController[NSPredicate predicateWithFormat:@"calendar.subscribed == 1"];来提取"事件"对象

日历

  • 订阅(BOOL)
  • 事件(一对多关系与"事件")

事件

  • 日历("日历和#34;的多对一关系)

一切正常,但如果我更改某些"日历"的subscribed属性并将上下文保存在其他线程中,controllerDidChangeContent未被调用。

我可以强制重新获取吗?怎么样?

3 个答案:

答案 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”使用不动产的事件名称。在它工作之前我使用了相同的方法。