在主线程上运行Objective-C而不阻塞它的方法

Ari*_*ian -1 multithreading objective-c grand-central-dispatch ios

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

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

如注释中所述,此代码与UI相关,必须在主线程上运行。

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

CRD*_*CRD 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]; });
Run Code Online (Sandbox Code Playgroud)

高温超导