-1

我知道这听起来不对!但我需要实现的是在主线程上运行一个巨大的枚举,这显然会阻塞整个应用程序。我正在寻找的是循环周期之间的一种动画或延迟,以便其他代码有机会执行。这是我的代码:

for (NSTextCheckingResult* match in matchedArray) {
    dispatch_async(dispatch_get_main_queue(), ^{
        [self addAttributes:@{NSBackgroundColorAttributeName:[UIColor redColor]} range:match.range];
    });
}

正如评论中提到的,此代码与 UI 相关,它必须在主线程上运行。

我也尝试过dispatch_after,但似乎它会在等待时间阻塞线程。无论如何我可以做到这一点,还是我必须重新设计我的整个逻辑?!

4

2 回答 2

5

当您在主线程上运行时,您的每个元素matchedArray都会按顺序处理。因此,您可以通过调度一个块来处理数组的元素n来实现您希望与主队列上的其他任务的交错,该数组在完成其任务后调度一个块来处理元素n + 1

类似于(所有代码直接输入答案):

- (void) processIndex:(NSUInteger)index ofArray:(NSArray *)matchedArray
{
   NSTextCheckingResult *match = matchedArray[index++];
   [self addAttributes:@{NSBackgroundColorAttributeName:[UIColor redColor]}
                 range:match.range];
   if(index < matchedArray.count)
      dispatch_async(dispatch_get_main_queue(),
                     ^{ [self processIndex:index ofArray:matchedArray]; });
}


...

if (matchedArray.count > 0)
   dispatch_async(dispatch_get_main_queue(),
                  ^{ [self processIndex:0 ofArray:matchedArray]; });

高温高压

于 2013-10-27T23:54:01.190 回答
0

像其他评论者一样,我也对主线程声明上的“应该”运行持怀疑态度,但我会让你怀疑你比我更了解你的情况......

您可以编写“巨大的枚举”以将中间状态存储在某种变量或结构中,让它运行 X 次迭代,然后使用完成处理程序进行延迟调用[self performSelector:@selector(crazyEnumerationMethod:) withObject:nil afterDelay:2.0]:

一旦所有数据都处理到您满意的程度,您就必须设计某种标志来翻转,这将阻止该方法再次触发。

本质上,您将多次迭代您的数据集,每次迭代都会暂停操作,直到最后所有数据都被处理并且标志翻转以防止再次迭代。

根据您的“大量枚举”所需要的内容,这可能是一个非常重要的编写过程,但您永远不知道,也许有一种干净而聪明的方法来存储中间状态并在每次迭代中从您离开的地方开始。

于 2013-10-27T23:53:49.033 回答