NSSortDescriptor中的块 - 目标C.

时间:2012-01-28 15:59:37

标签: objective-c ios macos nssortdescriptor

我有switch语句,可以创建相关的NSSortDescriptor。对于某些NSSortDescriptors我使用block作为自定义comparator(比较CMTimes)。以下代码工作正常,但我想添加一些NSSortDescriptors并比较CMTimes。由于block始终相同,因此可以创建variable来保存block,因此我无需继续复制和粘贴杂乱的代码。我想它应该是可能的,但我似乎无法让它发挥作用。我非常感谢任何帮助。谢谢!

NSSortDescriptor *sortDescriptor; 

switch (mode) {
    case 1:
        sortDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"startTime" ascending: YES comparator:^(id first, id second){
                    CMTime time1 = [first CMTimeValue];
                    CMTime time2 = [second CMTimeValue];
                    if (CMTIME_COMPARE_INLINE(time1, <, time2)) 
                        return NSOrderedAscending;
                    else if (CMTIME_COMPARE_INLINE(time1, >, time2))
                        return NSOrderedDescending;
                    else
                        return NSOrderedSame;
        }];
        break;
    case 2:
        sortDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"startTime" ascending: NO comparator:^(id first, id second){
                    CMTime time1 = [first CMTimeValue];
                    CMTime time2 = [second CMTimeValue];
                    if (CMTIME_COMPARE_INLINE(time1, <, time2)) 
                        return NSOrderedAscending;
                    else if (CMTIME_COMPARE_INLINE(time1, >, time2))
                        return NSOrderedDescending;
                    else
                        return NSOrderedSame;
        }];
        break;
    case 3:
        sortDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"info" ascending: YES];
        break;
    case 4:       
        sortDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"info" ascending: NO];
        break;
    default:
        break;
}

3 个答案:

答案 0 :(得分:9)

您可以创建一个块变量,这样就不必复制和粘贴块代码。

NSComparator comparisonBlock = ^(id first,id second) {
    return NSOrderedAscending;
};
[NSSortDescriptor sortDescriptorWithKey: @"startTime" ascending: YES comparator:comparisonBlock];

答案 1 :(得分:4)

你可以按照

的方式做点什么
NSComparator myBlock = ^(id first, id second) {
    CMTime time1 = [first CMTimeValue];
    CMTime time2 = [second CMTimeValue];
    if (CMTIME_COMPARE_INLINE(time1, <, time2)) 
        return NSOrderedAscending;
    else if (CMTIME_COMPARE_INLINE(time1, >, time2))
        return NSOrderedDescending;
    else
        return NSOrderedSame;
}

这将创建一个变量myBlock,它是一个返回类型为NSComparator的块,并带有两个id类型参数。

然后你应该可以打电话给例如:

sortDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"startTime" ascending: YES comparator:myBlock];

一切都应该很好用。

希望这会有所帮助,请告诉我是否还有其他任何可以帮助的方法:)

答案 2 :(得分:1)

当然,使用@property (nonatomic, copy)作为属性(不要忘记发布),或者只是在作业之前定义一个块。