なぜメインスレッドでそれをしたいのですか?典型的な答えは、これらの操作をバックグラウンド スレッドで実行し、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
});
}
});
アップデート:
フォアグラウンドでこれを行う必要があるように聞こえるので、おそらく a を使用するNSTimer
方が良いかもしれません。私は大物では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 が呼び出され、呼び出しごとに 1 つの UITextPosition が処理される可能性があります。
- (void)timerCallback:(NSTimer*)theTimer
{
BOOL moreTextPositionsToCalculate = ...;
if (moreTextPositionsToCalculate)
{
// calculate the next UITextPosition
}
else
{
[self stopTimer];
}
}
完了したら、次のようにタイマーを停止できます。
- (void)stopTimer
{
[_timer invalidate];
_timer = nil;
}