为什么要在主线程上做呢?典型的答案是在后台线程上执行这些操作,并将 UI 更新发送回主线程。例如,您可以使用Grand Central Dispatch:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// do my time consuming task and everytime it wants to update the UI,
// it should dispatch that back to the main queue, e.g.
for (NSInteger i = 0; i < 10000; i++)
{
// do my background work
// now update the UI
dispatch_async(dispatch_get_main_queue(), ^{
// update the UI accordingly
});
}
});
更新:
听起来您必须在前台执行此操作,因此使用 aNSTimer
可能会更好。我不是一个大个子NSTimer
,但它可能看起来像下面这样。
首先,确保你有一个类实例变量:
NSTimer *_timer;
接下来,您可以使用以下命令对其进行初始化:
- (void)startTimer
{
_timer = [NSTimer timerWithTimeInterval:0.0 target:self selector:@selector(timerCallback:) userInfo:nil repeats:YES];
NSRunLoop *runloop = [NSRunLoop currentRunLoop];
[runloop addTimer:_timer forMode:NSDefaultRunLoopMode];
}
然后这将调用 timerCallback,可能在每次调用时处理一个 UITextPosition:
- (void)timerCallback:(NSTimer*)theTimer
{
BOOL moreTextPositionsToCalculate = ...;
if (moreTextPositionsToCalculate)
{
// calculate the next UITextPosition
}
else
{
[self stopTimer];
}
}
完成后,您可以像这样停止计时器:
- (void)stopTimer
{
[_timer invalidate];
_timer = nil;
}