Cocoa touch 核心数据自定义访问器不';我甚至没有接到电话

Cocoa touch 核心数据自定义访问器不';我甚至没有接到电话,cocoa-touch,core-data,overriding,accessor,Cocoa Touch,Core Data,Overriding,Accessor,我有一个我试图在运行时设置的核心数据属性,它的值来自另一个属性。然而,奇怪的是,我构建的自定义访问器似乎从未被调用过 属性seasonNameVisible,仅从带有搜索字段中术语的谓词调用,如下所示: // Add our search predicates for (NSString *term in searchTerms) { NSPredicate *searchTermPredicate = [NSPredicate predicateWithFormat:@"(episod

我有一个我试图在运行时设置的核心数据属性,它的值来自另一个属性。然而,奇怪的是,我构建的自定义访问器似乎从未被调用过

属性
seasonNameVisible
,仅从带有搜索字段中术语的谓词调用,如下所示:

// Add our search predicates
for (NSString *term in searchTerms) {
    NSPredicate *searchTermPredicate = [NSPredicate predicateWithFormat:@"(episodeName contains[cd] %@) OR (fromSeason.seasonNameVisible contains[cd] %@) OR (fromSeason.fromSeries.seriesName contains[cd] %@)", term, term, term];
    [subPredicates addObject:searchTermPredicate];
}
如果我将该属性更改为
seasionname
,谓词的该部分将返回一个结果,因此我不会怀疑谓词或任何其他搜索代码

我的计划是在运行时从
季节名称
派生
季节名称可见
NSString。因此,我修改了
seasure
NSManagedObject子类,使用原语访问器覆盖访问器和设置器。但据我所知,我的访问者从未被呼叫过

以下是标题/接口:

//
//  Season.h
//

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>

@class Episode, Series;

@interface Season : NSManagedObject

@property (nonatomic, retain) NSNumber * seasonIndex;
@property (nonatomic, retain) NSString * seasonName;
@property (nonatomic, retain) NSString * seasonNameVisible;
@property (nonatomic, retain) NSSet *episodes;
@property (nonatomic, retain) Series *fromSeries;

@property (nonatomic, retain) NSString * primitiveSeasonName;
@property (nonatomic, retain) NSString * primitiveSeasonNameVisible;
@end

@interface Season (CoreDataGeneratedAccessors)

- (void)addEpisodesObject:(Episode *)value;
- (void)removeEpisodesObject:(Episode *)value;
- (void)addEpisodes:(NSSet *)values;
- (void)removeEpisodes:(NSSet *)values;

@end

// my additions
@interface Season (PrimitiveAccessors)
- (NSString *)primitiveSeasonName;
- (NSString *)primitiveSeasonNameVisible;
@end

我读过苹果的文档,在StackOverflow上四处搜索自定义访问器方法的帮助,我认为我的代码是对的(这是我第一次尝试使用原始访问器,或者重写NSManagedObject方法,所以我有点超出了我通常的深度),但即使我在上面设置了断点,它似乎从未被调用。

您要求核心数据基于延迟加载的属性获取。我认为这是行不通的。在设置季节名称时,您需要将季节名称设置为可见,或者,更合理的做法是,将季节名称的存储分离为前缀(您要删除以提供可见名称)和真实名称

在评论中提供了更多信息后,我将建议如下:

  • 将季节分为两个属性,季节编号(int)和季节名称
  • 根据季节编号对取货请求进行排序
  • section name key path是对象上的一个新只读属性,它返回由数字和名称组成的字符串
更改FRC使用的获取请求时,您在注释中看到的错误是正常的。从模拟器中删除应用程序并重新构建,它将消失,或者在开发时使用nil缓存。FRC永久存储其缓存(如在运行之间),因此任何更改都会打乱它

节名键路径可以是您喜欢的任何键路径或属性名称,只要排序相同。从NSFetchedResultsController的文档中:

sectionNameKeyPath

返回节名称的结果对象上的键路径。传递nil以指示控制器应生成单个节。 节名称用于预计算节信息。 如果此键路径与fetchRequest中第一个排序描述符指定的键路径不同,则它们必须生成相同的相对顺序。例如,fetchRequest中的第一个排序描述符可能指定持久属性的键sectionNameKeyPath可以为从持久属性派生的临时属性指定一个键

因此,您将有一个带有两个持久属性的
seasure
对象,
seasenNumber
seasenName
。你可以按季节号对取货请求进行排序。您的节名关键路径(对于具有
seasure
关系的剧集,可能是获取)将是
@“seasure.seasuresectionname”
,实现如下-在托管对象模型中没有更改,只更改了seasure对象:

第h季:

@property(nonatomic,readonly) NSString *seasonSectionName;
第三季m:

-(NSString*)seasonSectionName
{
    return [NSString stringWithFormat:@"%d - %@",self.seasonNumber,self.seasonName];
}

你真正要做的就是用另一个属性来装饰季号。

现在我再看一遍,我怀疑如果我用KVC调用所有东西,我不需要声明基本属性,但这仍然不会改变它没有被调用的事实。谓词用于获取请求,用于搜索视图,它是持久的,因为,正如你在下面的回答中所描述的,你不能用它来获取。问题更多的是
seasonNameVisible
返回
nil
,并且没有调用我的自定义访问器来填充它。我猜的答案现在已经被删除了。我非常确定获取请求不会通过对象来获取值,如果它们这样做了,它将是原始值(因此不会设置KVO通知)。如果访问单个对象的seasonNameVisible属性(例如在表视图单元格中显示),是否得到正确的结果?这是SQLLite存储吗?我相信回迁是直接进行的,而不是通过访问器。也许相反,替代aspeName的setter来设置asquarmame visibility?我从未真正设置
asquarmame
,因为它是从SQLite数据库中预先加载的数据。我在其中添加了前缀,以便可以将其用作表中的节标题。以前我将它们分开,但是如果字符串上没有前缀,那么它在获取时就不能正确排序,我试图避免为表中每个可能的节标题编写自定义大小写。我意识到这有点笨拙,但我想不出一个更理智的方法。。。也许从
seasonName
访问器调用
setseasonnameivable
会更有意义?我来试一试。你仍然需要访问每个季节,才能在数据库中存储正确的值。请注意,只要结果的顺序相同,就可以对节名键路径使用瞬时值(例如,仅返回字符串的方法)。季节名称中的数据是什么样的?你是如何推导前缀的?它们的排序顺序不一样,这就是为什么所有这些繁琐的问题摆在首位。季节名称是一个实际的名称,它不会按照季节应该排序的顺序按字母顺序排序。呵呵。我在第一条评论中尝试了我的建议,但遇到麻烦,我得到了:
'nsinternalinconsistenceexception',原因:'CoreData:FATAL ERROR:节信息的持久缓存与当前配置不匹配。你有黑眼圈吗
-(NSString*)seasonSectionName
{
    return [NSString stringWithFormat:@"%d - %@",self.seasonNumber,self.seasonName];
}