在后台线程中运行一个方法后,应用程序崩溃
我正在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,则不需要该行。