【问题标题】:How to cancel sortUsingComparator如何取消 sortUsingComparator
【发布时间】:2021-02-28 07:16:59
【问题描述】:

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

【问题讨论】:

    标签: objective-c nsarray


    【解决方案1】:

    我认为这不是一件容易的事。大概您正在并发环境中工作。然后这样的事情应该会导致排序快速退出。 sortCancelBOOL 设置的时候也需要同步访问权限,如下图获取时一样。

    __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;
    }];
    

    我没有对此进行测试,但这应该会破坏排序或使其快速完成。

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

    【讨论】:

    • 我的数组可能会在其他线程上更改,因此排序结果不准确。而如果超过10000的数据太多或者比较条件复杂,我认为排序会浪费CPU性能。
    • 非常感谢。该解决方案确实使排序更快,但这是一种问候方式。
    • 谢谢 - 你描述它的方式是我认为的情况,这是少数几次这是有道理的。虽然这不是您在设置取消时必须仔细考虑的问题,例如在你提到的那些变化发生之前。在更改数组之前,您可能需要等待排序退出。如果比较成本很高,这将有很大帮助,但对于大多数控制,您可能需要编写自己的排序算法,以便在需要取消排序时可以更好地退出。
    • @WalkerQiu 如果它与 CPU 有关,如果方便的话,您可以考虑缓存一些排序,因此重复排序不必再次从头开始。如果该信息对你有任何价值,那么NSOrderedSet 作为“数据类型”。
    • 是的,我完全同意这个评论。也许您需要对数组进行一次完全排序,然后在更改数组时以保持排序的方式进行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-02
    • 2023-03-24
    • 2011-12-28
    • 2023-03-09
    相关资源
    最近更新 更多