UITableViewCell でアニメーションを実行します。各セルには独自のアニメーションがあり、セルは再利用可能です。私が使う[mView performSelectorInBackground:@selector(layoutSubview) withObject:nil];
バックグラウンド スレッドで runLoop を開始して、次のようなタスクを実行します。
- (void)startAnimation
{
NSRunLoop *mLoop = [NSRunLoop currentRunLoop];
self.animationTimer = [NSTimer scheduledTimerWithTimeInterval:animationInterval target:self selector:@selector(setNeedsDisplay) userInfo:nil repeats:YES];
mRunLoop = YES;
while (mRunLoop == YES && [mLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.01]]);
}
そしてそれを止めます:
- (void)stopAnimation
{
if (![NSThread isMainThread]) {
[[NSThread currentThread] cancel];
}
mRunLoop = NO;
self.animationTimer = nil;
CFRunLoopStop(CFRunLoopGetCurrent());
}
テーブルを高速スクロールすると問題が発生します。これは、最初のセルの開始時にアニメーションを開始するため、最初の runLoop 呼び出しが発生して setNeedDisplay とそこからすべてのメソッドが実行されるためです。しかし、最初の runLoop サイクルが終了する前に、セルはビューから消え、すでに再利用可能になっています。それで、サイクルがまだ操作を実行している間に、それをクリアし始めます。ここで、次のような状況に遭遇します
割り当て解除されたインスタンスに送信されたメッセージ
そのスレッドでの操作の実行を正しく停止するにはどうすればよいか、ヒントを教えてください。たとえば、いくつかのアクションを実行しているオブジェクトを実現したい場合、すぐに停止する方法はありますか?
十分な情報を提供したことを願っています。ありがとう
更新:まったくアイデアがありませんか?