2012-08-04 56 views
5

我正在使用一个核心数据NSFetchedResultsController UITableView,具有瞬态NSDate属性。我将它作为一个瞬态属性的主要原因是我的UITableView条目基于NSDate放入部分,但可以在日期更改时在部分之间移动。iOS - 如何刷新/更新核心数据瞬态属性?

到目前为止,它似乎工作得很好,但它只更新/刷新(我真的很新,所以我不知道我是否使用了正确的术语,对不起!)当我关闭应用程序并将其从多任务中删除,或通过Xcode重新运行。如果我不这样做,这些项目不会改变,也不会放入正确的部分。有没有办法手动让它刷新,所以用户不需要这样做,让它运行正确?

谢谢!

+0

如何传播更新? NSFetchedResultsController委托? – Mundi 2012-08-04 21:07:01

+0

是的,我认为是。 – mhbdr 2012-08-04 21:27:28

+1

对于SQlite商店,您可能不适用于排序描述符的瞬态属性。 – 2012-08-05 06:55:14

回答

3

当您向对象发送refreshObject:mergeChanges:时,瞬态属性会刷新。

Mundi提供的应用关键值观察机制的解决方案也可以起作用,如果确实如此,它肯定比明确刷新更方便。

+0

嘿斯维纳,谢谢你的回复。我会在哪里放置refreshObject:mergeChanges?它会在行动中吗?谢谢! – mhbdr 2012-08-06 07:08:37

+0

您可以在知道日期更改的点上刷新对象。不过,我鼓励你采取蒙迪推荐的方法。它更方便。知道你总是可以明确地刷新一个瞬态属性并且你应该选择,这是很好的。 – svena 2012-08-06 20:35:21

+0

似乎没有刷新瞬态属性:“如果标志为YES,则此方法不会影响任何瞬态属性” https://developer.apple.com/reference/coredata/nsmanagedobjectcontext/1506224-refreshobject – 2017-03-22 18:53:13

7

第一个,请确保您创建您的抓取结果控制器时,瞬态属性仅用于sectionNameKeyPath。最好命名为sectionIdentifier(正如Apple在其示例代码中所做的那样)。实际日期应该是您实体的单独属性。 (我将其称之为dateAttribute

,请确保您在Entity.m文件中指定的关键路径依赖:

+ (NSSet *)keyPathsForValuesAffectingSectionIdentifier { 
    // If the value of dateAttribute changes, the section identifier may change as well. 
    return [NSSet setWithObject:@"dateAttribute"]; 
} 

,确保在你的控制器,你作出适当的反应在管理对象方面的变化通过

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller 
{ 
    if (!self.tableView.editing) [self.tableView reloadData]; 
    // the quick and dirty method without animations; 
    // see referenced code for a more pleasant approach 
} 

如果有不清楚的地方,看看苹果的例子DateSectionTitles

+0

你是否100%肯定keyPathsForValuesAffecting ...在它是一个瞬态属性时强制刷新?我之前已经注意到,仅当refreshObject:mergeChanges:被发送到对象时,瞬态属性才会刷新。 – svena 2012-08-06 06:30:43

+0

是的,当然。这是来自现场应用程序的工作代码。 – Mundi 2012-08-06 07:11:49

+0

所以我建立了几乎完全像苹果的例子,但它似乎没有刷新时,有一个变化。每个项目的部分标识符都是由nsdate差异的大计算创建的,但是当我启动应用程序时,它似乎并没有像我从多任务处理应用程序并重新打开应用程序那样再次计算它们。 – mhbdr 2012-08-07 18:52:04