在后台线程中使用“setNeedsDisplay”方法的错误访问

时间:2013-02-11 12:35:57

标签: iphone ios objective-c

在我的应用中有一个对象拖动和视频录制。我在我的应用中使用ScreenCapture视图。我正在拍摄主屏幕截图并制作视频。

当我在drawRect()视图的ScreenCapture方法中使用以下代码时,iOS 6的拖动速度变慢,适用于iOS 5:

[self performSelector:@selector(setNeedsDisplay) withObject:nil
      afterDelay:delayRemaining > 0.0 ? delayRemaining : 0.01];

当我用以下代码替换该行代码时,拖动工作正常,但访问不正确:

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

这是什么原因?

3 个答案:

答案 0 :(得分:1)

你应该只在主线程中调用UI方法,所以你不能这样做。

如果您的视图很慢,那么您需要安排在后台线程中执行昂贵的操作,这样可以在主线程中更快地绘制。

你打电话的实际方法无论如何都没有做任何事情;它只是标记重绘的视图。仍需要在drawRect方法中进行工作。

答案 1 :(得分:1)

因为drawRect方法仅适用于主线程。 Apple文档称UIKit仅工作主线程。你需要在mainthread

中setNeedsLayout吗?

答案 2 :(得分:0)

正在更新的UIKit控件应该在主线程上调用 NOT 。因为UIKit类不是线程安全的。

我使用过ScreenCaptureView类。 在这种情况下,你可以在后台调用另一个方法,并在该方法中使用drawRect代码,如下所示,

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



-(void)callCodeInsideDrawRect
{
 //any code which is required to be called in background (drawRectCode)
 //in ur case draw rect block

}