核心数据:使用延迟实例化时的奇怪错误行为

Posted

技术标签:

【中文标题】核心数据:使用延迟实例化时的奇怪错误行为【英文标题】:Core Data: Strange faulting behavior when using lazy instantiation 【发布时间】:2012-07-24 09:27:57 【问题描述】:

我已向我的NSManagedObject IBCompany 添加了一个类别,该类别应根据简单的日期比较检索特定时间段,这是 IBCompany 的关系之一。

当我运行以下代码时,NSArray sortedFinPeriodsDesc 以正确的排序顺序包含故障期间。但是,当在for each 循环中访问它们时,每个句点的属性都返回 nil,特别是 EndDate 的返回 nil。出于这个原因,我的方法lastReportedPeriodforDate 总是返回 nil,这是一个错误。

#import "IBCompany+FinstatAccessors.h"

@implementation IBCompany (FinstatAccessors)

NSArray *sortedFinPeriodsDesc;

- (IBFinPeriod*)lastReportedPeriodforDate:(NSDate*)date;

    if ( !sortedFinPeriodsDesc ) 
        NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"EndDate" ascending:NO];
        sortedFinPeriodsDesc = [self.finperiod sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];
           
    IBFinPeriod *lastPeriod;
    for (IBFinPeriod *finPeriod in sortedFinPeriodsDesc) 
        if ( [finPeriod.EndDate compare:date] == NSOrderedAscending ) // finPeriod.EndDate < date
            lastPeriod = finPeriod;
            break;
        
    
    return lastPeriod;

但是,当通过删除 if clause 并始终实例化和排序 NSArray sortedFinPeriodsDesc 来替换方法中的第一行(延迟实例化)时,代码可以正常工作。

因此,我有几个问题

我的代码有什么错误?如何影响惰性实例化 有错吗? 您是否建议将 NSArray sortedFinPeriodsDesc 定义为瞬态属性并将其排序到 awakeFromFetch 中? 您认为最好的选择是什么?

非常感谢您的帮助!

【问题讨论】:

将数组中的 NSManagedObject 转换为您的类 IBFinPeriod.. 可能是个问题?还要仔细检查 awakefrominsert 等。 该数组真的在实现部分定义为“浮动”吗? Vaibhav,我还没有使用 awakeFromInsert。我只使用上面我的问题中提供的代码。 Jrturton,你所说的“飘来飘去”是什么意思? 我的意思是,你只是将它单独写在一行上,而不是在通常声明 ivars 的大括号内? 这是我让它工作的唯一方法。如果我把它放在接口声明@interface IBCompany (FinstatAccessors) @private NSArray *sortedFinPeriodsDesc, *sortedFinPeriodsAsc; 中,我会收到错误消息Ivars may not be placed in categories 【参考方案1】:

“延迟加载”带有过早优化的味道。特别是您实现它的方式,您实际上并没有使用实例变量,而是使用全局变量(有关详细信息,请参阅here),这意味着每个对象都没有拥有自己的数组版本。

我建议将数组放在本地并在每次需要时生成它。如果这会影响性能,您可以查看其他方法,但即使上面的 ivar 问题已解决,如果周期集被更新,您也会遇到问题 - 您的数组现在已过时。

你还没有说你的对象在这个时间段被问了多少次,或者有多少对象,或者多少个时间段,所以很难给出更具体的建议。

fetched property 可能是获得月经的更有效方式,但我没有足够的经验来帮助您解决具体情况。

【讨论】:

以上是关于核心数据:使用延迟实例化时的奇怪错误行为的主要内容,如果未能解决你的问题,请参考以下文章

获取未保存数据时的奇怪核心数据行为

使用 websocket 时的奇怪行为

在模态显示的 UIViewController 中使用 UITableView 时的奇怪行为

尝试将行附加到按对象分组中的每个组时的奇怪行为

使用两个着色器时的opengl奇怪行为

在 SwiftUI 视图中的 TextField 后面使用多个 SecureField 时的奇怪行为