在后台线程中运行一个方法后,应用程序崩溃

我正在logging我们可以拖动图像的主屏幕。

我有一个setneedsdisplay方法,减慢拖动的对象。

但是,当我在后台线程调用相同的方法问题已解决,但应用程序崩溃。

另外,如果有没有其他的select来loggingvideo,而不是一次又一次调用drawRect:方法?

- (void) drawRect:(CGRect)rect { NSDate* start = [NSDate date]; CGContextRef context = [self createBitmapContextOfSize:self.frame.size]; CGAffineTransform flipVertical = CGAffineTransformMake(1, 0, 0, -1, 0, self.frame.size.height); CGContextConcatCTM(context, flipVertical); [self.layer renderInContext:context]; CGImageRef cgImage = CGBitmapContextCreateImage(context); UIImage* background = [UIImage imageWithCGImage: cgImage]; CGImageRelease(cgImage); self.currentScreen = background; if (_recording) { float millisElapsed = [[NSDate date] timeIntervalSinceDate:startedAt] * 1000.0; [self writeVideoFrameAtTime:CMTimeMake((int)millisElapsed, 1000)]; } float processingSeconds = [[NSDate date] timeIntervalSinceDate:start]; delayRemaining = (1.0 / self.frameRate) - processingSeconds; //CGContextRelease(context); //redraw at the specified framerate //[self performSelector:@selector(setNeedsDisplay) withObject:nil afterDelay:delayRemaining > 0.0 ? delayRemaining : 0.01]; [self performSelectorInBackground:@selector(setNeedsDisplay) withObject:nil]; } 

可能的原因:

 [self performSelectorInBackground:@selector(setNeedsDisplay) withObject:nil]; 

您正在从后台线程更新您的用户界面 。 永远不要这样做,如果你需要用你的用户界面做些什么,在主线程中执行。

另外我在你的代码中发现了一个问题:

您正在从drawRect:调用setNeedsDisplay drawRect:它将再次调用drawRect:

(如果您需要更新您的视图调用[self setNeedsDisplay];并且不要直接调用drawRect:

我猜setNeedsDisplay:必须在主线程上调用。 大多数UI方法不适用于后台线程。

如果你把你的渲染方法放到你的问题中,我们可以看看它们是否可以改进?

并尝试只设置setNeedsDisplayInRect:如果你只想重画一部分的显示?

你不应该调用任何在后台线程中更新UI的方法。 始终从主线程更新UI。 如果在调用setNeedsDisplay方法时调用drawrect,则不需要该行。