iOS - 如何刷新/更新核心数据瞬态属性?

Posted

技术标签:

【中文标题】iOS - 如何刷新/更新核心数据瞬态属性?【英文标题】:iOS - How to refresh/update Core Data transient property? 【发布时间】:2012-08-02 11:06:27 【问题描述】:

我正在使用具有瞬态 NSDate 属性的核心数据 NSFetchedResultsController UITableView。我将其作为瞬态属性的主要原因是我的 UITableView 条目会根据 NSDate 放入部分中,但是当日期更改时可以在部分之间移动。

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

谢谢!

【问题讨论】:

更新是如何传播的? NSFetchedResultsController 委托? 可能相关的是,对于 SQlite 存储,您不能将瞬态属性用于排序描述符。 【参考方案1】:

首先,在创建获取的结果控制器时,请确保您的瞬态属性仅用于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

如果有任何不清楚的地方,请查看 Apple 示例 DateSectionTitles。

【讨论】:

您是否 100% 确定 keyPathsForValuesAffecting... 强制刷新,而它是一个瞬态属性?我之前注意到,仅当 refreshObject:mergeChanges: 发送到对象时才会刷新瞬态属性。 所以我将它设置为几乎与 Apple 示例完全一样,但是当有更改时它似乎不会刷新。每个项目的部分标识符是通过对 nsdate 差异的大量计算创建的,但是当我启动应用程序时,它似乎并没有像我从多任务处理中终止应用程序并重新打开它时那样再次计算这些。 我必须更改 Apple 代码才能使其正常工作。如果我没记错的话,你必须摆脱原始部分标识符“tmp”的懒惰创建。只需始终执行 if 块中的内容。 或者您可以将瞬态属性设置为nil,当您更改它所依赖的属性时。这样,if 块仅在它所依赖的属性发生变化时执行(参见上面提到的 Apple 示例 DateSectionTitles 中 Event.m 中的 -setTimeStamp: 实现)。 @Mundi 有时间可以看看这个:***.com/questions/24482449/…【参考方案2】:

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

Mundi 提供的应用键值观察机制的解决方案可能也有效,如果有效,肯定比显式刷新方便得多。

【讨论】:

嗨 svena,感谢您的回复。我将把 refreshObject:mergeChanges 放在哪里?它会在动作中吗?谢谢! 您可以在知道日期已更改的位置刷新对象。但是,我鼓励您采用 Mundi 推荐的方法。它更方便。很高兴知道您也可以随时显式刷新瞬态属性。 似乎没有刷新瞬态属性:“如果标志为YES,此方法不会影响任何瞬态属性”developer.apple.com/reference/coredata/nsmanagedobjectcontext/…

以上是关于iOS - 如何刷新/更新核心数据瞬态属性?的主要内容,如果未能解决你的问题,请参考以下文章

使用核心数据实现瞬态属性

核心数据,“按瞬态属性排序”解决方法

如何过滤从 Core Data 获取的数据?

更新表格视图单元格中的核心数据值后如何刷新

如何刷新基于_id(非瞬态)的关系与获取不同步的对象

将属性更改为不再是瞬态的 - 我可以通过轻量级核心数据迁移来做到这一点吗?