Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 我如何做一个不区分大小写的NSFetchedResultsController,它也会忽略诸如“quot;“是什么?”;?_Objective C_Ios_Sorting_Core Data - Fatal编程技术网

Objective c 我如何做一个不区分大小写的NSFetchedResultsController,它也会忽略诸如“quot;“是什么?”;?

Objective c 我如何做一个不区分大小写的NSFetchedResultsController,它也会忽略诸如“quot;“是什么?”;?,objective-c,ios,sorting,core-data,Objective C,Ios,Sorting,Core Data,我正在开发一个核心数据驱动的应用程序,它有两个实体需要在NSFetchedResultsController中进行特殊排序 2的简单例子只需要忽略“The”,这样(我引用的是真实的数据示例)种植节按照排序顺序跟随泥炭岭节。为了安全起见,我还希望使该排序不区分大小写。对于这一点,我尝试了这里的建议,添加了 @property (nonatomic, readonly) NSString * sortname; 到我的实体定义类的接口& - (NSString *)sortname { N

我正在开发一个核心数据驱动的应用程序,它有两个实体需要在
NSFetchedResultsController
中进行特殊排序

2的简单例子只需要忽略“The”,这样(我引用的是真实的数据示例)种植节按照排序顺序跟随泥炭岭节。为了安全起见,我还希望使该排序不区分大小写。对于这一点,我尝试了这里的建议,添加了

@property (nonatomic, readonly) NSString * sortname;
到我的实体定义类的接口&

- (NSString *)sortname
{
    NSMutableString *temp = [NSMutableString stringWithString:[[self name] lowercaseString]];
    if ([temp hasPrefix:@"the "]) {
        return [temp substringFromIndex:4];
    }
    return temp;
}
但是当我给它
@“sortname”
作为
nssortddescriptor
的键时,应用程序崩溃了

第二个实体更复杂。除了去掉排序的“The”外,还有“A”和诸如“Dr”和“Professor”之类的敬语,但并不总是如此。Ian Lowe教授和Wallace教授的木偶剧就是数据中的一个例子。Ian Lowe是一个真实的人(尽管我很尊重他),他应该被归类为Ian,但没有Wallace教授,那只是一个,木偶剧院&它应该在P下排序。对于它的选择性方面,我认为除了在实体上有一个布尔属性外,没有其他方法可以指定是否为排序目的去除第一个单词

剩下的问题归结为。。。当我将核心数据实体的名称作为
NSFetchedResultsController的
NSSortDescriptor
的键传递时,是否有一种方法可以在核心数据实体上创建一个虚拟属性(因为不想知道更正确的术语)

我不想采用的绝望方法是在这两个实体上创建real
sortname
属性&在填充实体时计算值

更新。。。 试图遵循TechZen的答案这是我的NSFetchedResultsController的构造函数

- (NSFetchedResultsController *)frc
{
    if (_frc) return _frc;

    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"EventProfile"
                                              inManagedObjectContext:_moc];
    [request setEntity:entity];
    NSSortDescriptor *sorter = [[NSSortDescriptor alloc] initWithKey:@"name"
                                                           ascending:YES
                                                          comparator:^NSComparisonResult(id obj1, id obj2) {
        NSMutableString *sortname1 = [NSMutableString stringWithString:[obj1 lowercaseString]];
        if ([sortname1 hasPrefix:@"the "]) {
            sortname1 = [NSMutableString stringWithString:[sortname1 substringFromIndex:4]];
        }
        NSMutableString *sortname2 = [NSMutableString stringWithString:[obj2 lowercaseString]];
        if ([sortname2 hasPrefix:@"the "]) {
            sortname2 = [NSMutableString stringWithString:[sortname2 substringFromIndex:4]];
        }
        return [sortname1 compare:sortname2];
    }];

    [request setSortDescriptors:[NSArray arrayWithObject:sorter]];
    [sorter release], sorter = nil;
    [request setFetchBatchSize:15];

    NSFetchedResultsController *frcTemp = [[NSFetchedResultsController alloc] initWithFetchRequest:request
                                                                              managedObjectContext:_moc
                                                                                sectionNameKeyPath:nil
                                                                                         cacheName:[NSString GetUUID]];
    [self setFrc:frcTemp];
    [_frc setDelegate:self];
    [frcTemp release], frcTemp = nil;
    [request release], request = nil;

    if ([[_frc fetchedObjects] count] == 0) {
        //<#statements#>
    }

    return _frc;
}
-(NSFetchedResultsController*)frc
{
如果(_frc)返回_frc;
NSFetchRequest*request=[[NSFetchRequest alloc]init];
NSEntityDescription*实体=[NSEntityDescription entityForName:@“EventProfile”
inManagedObjectContext:_moc];
[请求集合实体:实体];
NSSortDescriptor*分类器=[[NSSortDescriptor alloc]initWithKey:@“name”
上升:是的
比较器:^n比较结果(id obj1,id obj2){
NSMutableString*sortname1=[NSMutableString stringWithString:[obj1小写字符串]];
if([sortname1 hasPrefix:@“the”]){
sortname1=[NSMUTABLETSTRING stringWithString:[sortname1 substringFromIndex:4]];
}
NSMutableString*sortname2=[NSMutableString stringWithString:[obj2小写字符串]];
if([sortname2 hasPrefix:@“the”]){
sortname2=[NSMUTABLETSTRING stringWithString:[sortname2 substringFromIndex:4]];
}
返回[sortname1比较:sortname2];
}];
[请求设置排序描述符:[NSArray ARRAY WITHOBJECT:sorter]];
[分拣机释放],分拣机=无;
[请求setFetchBatchSize:15];
NSFetchedResultsController*frcTemp=[[NSFetchedResultsController alloc]initWithFetchRequest:请求
managedObjectContext:\u moc
sectionNameKeyPath:无
cacheName:[NSString GetUUID]];
[自设置FRC:frcTemp];
[_frcsetdelegate:self];
[frcTemp释放],frcTemp=nil;
[请求释放],请求=无;
如果([[u frc fetchedObjects]计数]==0){
//
}
收益率(frc);;
}
不过,它仍在按名称排序。我在comparator块中插入了一个“我在这里”的日志行&它没有出现在我的日志中,这让我觉得comparator甚至没有被执行


Cheers&TIA,Pedro:)

您可能希望将排序描述符与块或选择器(函数)一起使用,例如

使用块或选择器,可以根据需要创建复杂的自定义排序


您还可以在同一个获取请求中使用多个排序,请记住排序是按数组顺序计算的

NSSortDescriptor不接受瞬态属性。但是有一个解决办法

在NSFetchedResultsController中

将“sectionNameKeyPath”设置为过滤器,并将NSSortDescriptor保留为核心数据中的真实列。 所以你的代码应该是:

NSFetchedResultsController *fetcher = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
                                                                  managedObjectContext:context
                                                                    sectionNameKeyPath:@"sortname" 
                                                                             cacheName:nil];

从对这个问题的回答中可以看出,我一直致力于创建真正的sortname属性:(我将保留我的问题,以防万一解决方案可以改进。我已对问题进行了编辑,以包含我尝试实现此功能的结果。除非我以某种方式弄错了,否则这对未分组列表不起作用&对于分组列表,会导致大量的1个项目组。
NSFetchedResultsController *fetcher = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
                                                                  managedObjectContext:context
                                                                    sectionNameKeyPath:@"sortname" 
                                                                             cacheName:nil];