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

时间:2013-02-08 11:54:13

标签: iphone ios objective-c xcode ios5

我正在重新编码我们可以拖动图像的主屏幕。

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

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

此外,如果还有其他选项来录制视频而不是一次又一次地调用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];

}

3 个答案:

答案 0 :(得分:4)

可能的原因:

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

您正在从后台主题更新您的用户界面。 永远不要这样做,如果您需要对UI做一些事情,请在主线程中执行。

此外,我发现您的代码存在问题:

您正在呼叫setNeedsDisplay中的drawRect:,它会再次呼叫drawRect:

(如果您需要更新视图通话[self setNeedsDisplay];,请勿直接致电drawRect:。)

答案 1 :(得分:1)

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

如果您将渲染方法放入您的问题中,我们可以看看它们是否可以改进?

如果您只想重新绘制部分显示内容,请尝试仅设置setNeedsDisplayInRect:

答案 2 :(得分:1)

您永远不应该调用任何在后台线程中更新UI的方法。始终从主线程更新UI。如果在调用setNeedsDisplay方法时调用drawrect,那么在那里讨论你的代码就不需要那行了。