Objective c 如何取消sortUsingComparator

Objective c 如何取消sortUsingComparator,objective-c,nsarray,Objective C,Nsarray,数组排序时,[arr sortUsingComparator:sortByTime] 然后我想取消手术。我该怎么办?我认为这不太可能。您可能正在并发环境中工作。然后,类似这样的操作会导致排序快速退出。当您设置sortCancelBOOL时,您需要同步对它的访问,就像您得到它时一样,如下所示 __block BOOL sortCancel = NO; NSObject * lock = NSObject.new; // Sync access to sortCancel NSArray *

数组排序时,[arr sortUsingComparator:sortByTime]
然后我想取消手术。我该怎么办?

我认为这不太可能。您可能正在并发环境中工作。然后,类似这样的操作会导致排序快速退出。当您设置
sortCancel
BOOL时,您需要同步对它的访问,就像您得到它时一样,如下所示

__block BOOL sortCancel = NO;
NSObject * lock = NSObject.new;    // Sync access to sortCancel

NSArray *sortedArray = [array sortedArrayUsingComparator: ^(id obj1, id obj2) {
 
    @synchronized ( lock ) {
       // Check for cancel
       if ( sortCancel ) {
         // Sort has been cancelled
         return (NSComparisonResult)NSOrderedSame;
       }
    }

    // 'Normal' compare, e.g.
    if ([obj1 integerValue] > [obj2 integerValue]) {
        return (NSComparisonResult)NSOrderedDescending;
    }
 
    if ([obj1 integerValue] < [obj2 integerValue]) {
        return (NSComparisonResult)NSOrderedAscending;
    }
    return (NSComparisonResult)NSOrderedSame;
}];
\uu块BOOL sortCancel=NO;
NSObject*lock=NSObject.new;//同步访问sortCancel
NSArray*sortedArray=[使用比较器的数组sortedArray:^(id obj1,id obj2){
@已同步(锁定){
//检查是否取消
if(sortCancel){
//排序已取消
返回(NSComparisonResult)命令名;
}
}
//“正常”比较,例如。
如果([obj1整型值]>[obj2整型值]){
返回(NSComparisonResult)或撤销;
}
如果([obj1整型值]<[obj2整型值]){
返回(NSComparisonResult)或删除;
}
返回(NSComparisonResult)命令名;
}];
我没有对此进行测试,但这应该会破坏排序或使其快速完成


我想知道您为什么要中止排序?

我的数组可能在其他线程上更改,因此排序结果不准确。如果有太多的数据超过10000或比较条件复杂,我认为排序会浪费CPU性能。非常感谢。该解决方案确实会加快排序速度,但这是一种很好的方式。谢谢-你描述它的方式就是我假设的情况,这是少数几次有意义的方式之一。虽然这不是您在设置取消时必须仔细考虑的问题,例如,在您提到的更改发生之前。在更改数组之前,可能需要等待排序退出。如果比较很昂贵,这会有很大帮助,但对于大多数控件,您可能需要编写自己的排序算法,以便在需要取消排序时可以更好地退出。@WalkerQiu如果是关于CPU的,如果方便的话,您可以考虑缓存一些排序,因此,重复排序不必再次从头开始。如果该信息对您有任何价值,则有
ensorderedset
作为“数据类型”。是的,我完全同意这一评论。也许您需要对数组进行一次完全排序,然后在更改数组时以保持排序的方式进行排序。