ios NSMutableArray排序--将参数传递给比较器块

pokxtpni  于 2023-05-30  发布在  iOS
关注(0)|答案(2)|浏览(247)

我需要对字符串数组进行排序,并希望访问比较器块中的viewController属性。因此,计划将ViewController对象传递给比较器块。如何将参数传递给比较器模块?
这里是代码。
由于比较器逻辑很长,并且排序在很多地方都被使用,所以我不能在声明中扩展comparatorBlock。

sortedArray = [NsMutableArray arrayWithArray:[unsortedArray sortedArrayWithOptions:0 usingComparator:comparatorBlock]];
xv8emn3q

xv8emn3q1#

如果你在视图控制器的方法中定义块,那么它应该能够访问self
如果你做不到这一点,你可以创建一个函数来返回代码块,并将视图控制器捕获为函数参数:

static NSComparator blockWithViewController(UIViewController *viewController) {
    return ^NSComparisonResult (id object1, id object2) {
        NSLog(@"view controller is %@", viewController);
        return NSOrderedSame;
    };
}

你可以这样使用它:

NSMutableArray *sortedArray = [[unsortedArray sortedArrayWithOptions:0 usingComparator:blockWithViewController(viewController)] mutableCopy];
nkkqxpd9

nkkqxpd92#

altom's answer给了我一个构建错误,“正在返回本地堆栈上的块”。
这可以通过将块 Package 在Block_copy()中来解决,如nielsbot's answer to a similar question
本例使用的是MRR而不是ARC,因此添加了自动释放。

static NSComparator blockWithViewController(UIViewController *viewController) {
    return [Block_copy(^NSComparisonResult (id object1, id object2) {
        NSLog(@"view controller is %@", viewController);
        return NSOrderedSame;
    }) autorelease];
}

相关问题