iOS   发布时间:2022-03-30  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了ios – 具有任意排序的NSSortDescriptor大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我无解决如何使用NSSortDescriptor进行任意排序的问题.

我想做这样的事情:

NSArray *sortAlgorithm = [NSArray arrayWithObjects:@"@",@"#",@"!",@"&",@"r",@"a",nil];

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" 
                                                               ascending:YES 
                                                              comparator:
    ^(id obj1,id obj2) {
        NSComparisonResult comparisonResult;
        //Some code that uses sortAlgorithm.
        return comparisonResult;
    }
];

这将按键名对对象进行排序,以便以@开头的任何键,例如@home,会出现在以r开头的任何密钥之前,例如激进的,并且在任何以a开头的键之前再次出现,例如任何东西.

以上只是一个例子.关键是要完全任意排序.

这将用于NSFetchedResultsController.

代码// //使用sortAlgorithm的代码看起来像什么?

编辑:

围绕我尝试实现sortDescriptor的代码,如PR. occulus的建议:

- (NSFetchedResultsController *)fetchedResultsController {
    if (__fetchedResultsController)
        return __fetchedResultsController;

    NSFetchrequest *fetchrequest = [[NSFetchrequest alloc] init];

    fetchrequest.entity = [NSEntityDescription entityForName:@"Tag" inManagedObjectCo@R_675_10443@t:self.temporarymanagedObjectCo@R_675_10443@t];

    //NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:NO];
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:NO comparator:^(id obj1,id obj2) {

        NSArray *sortAlgorithm = [NSArray arrayWithObjects:@"#",@"@",@".",nil];

        NSString *obj1FirstChar = [(NSString *)obj1 subStringToIndex:1];
        NSString *obj2FirstChar = [(NSString *)obj2 subStringToIndex:1];
        int idx1 = [sortAlgorithm indexOfObject:obj1FirstChar];
        int idx2 = [sortAlgorithm indexOfObject:obj2FirstChar];

        if ( idx1 < idx2 )
            return NSorderedAscending;
        else if ( idx1 > idx2 )
            return NSorderedDescending;
        else
            return NSorderedSame;
    }];

    fetchrequest.sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
    fetchrequest.fetchBatchSize = 20;        

    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchrequest:fetchrequest managedObjectCo@R_675_10443@t:self.temporarymanagedObjectCo@R_675_10443@t sectionNameKeyPath:nil cachename:@"Tags"];

    aFetchedResultsController.delegate = self;
    self.fetchedResultsController = aFetchedResultsController;

    [self.fetchedResultsController performFetch:nil];

    return __fetchedResultsController;
}

注释掉的sortDescriptor可以工作.

在实体“Tag”的对象上肯定有一个名为name的属性.但即使没有,这似乎也不是问题. Xcode似乎甚至没有编译那行代码(sortDescriptor),这听起来很荒谬.断点工作正常,但没有打破特定的代码行.

解决方法

你需要将obj1和obj2字符串的第一个字符拉出为NSStrings,在任意排序数组中找到它们的索引,然后比较这些位置.

这样的事情:(把这段代码放在你的^块中)

NSString *obj1FirstChar = [(NSString *)obj1 subStringToIndex:1];
NSString *obj2FirstChar = [(NSString *)obj2 subStringToIndex:1];
int idx1 = [sortAlgorithm indexOfObject:obj1FirstChar];
int idx2 = [sortAlgorithm indexOfObject:obj2FirstChar];

// NOTE: we haven't dealt with the case where one of the
// chars wasn't found in the array of characters. A strategy
// for this would need to be decided.

if (idx1 == idx2) {
    return NSorderedSame;
}
if (idx1 < idx2) {
    return NSorderedAscending;
}
return NSorderedDescending;

未经测试,可能需要稍微调整一下.注意大/小写字符差异.

更新:使用自定义排序描述符和sql支持的核心数据存储似乎存在问题.有关详细信息,请参阅this question.

大佬总结

以上是大佬教程为你收集整理的ios – 具有任意排序的NSSortDescriptor全部内容,希望文章能够帮你解决ios – 具有任意排序的NSSortDescriptor所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。