首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在后台线程中使用"setNeedsDisplay“方法访问错误

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

Stack Overflow用户
提问于 2013-02-11 20:35:57
回答 3查看 535关注 0票数 0

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

当我在我的ScreenCapture视图的drawRect()方法中使用以下代码时,iOS 6的拖拽速度变慢,而iOS 5的拖拽速度却很好:

代码语言:javascript
运行
复制
[self performSelector:@selector(setNeedsDisplay) withObject:nil
      afterDelay:delayRemaining > 0.0 ? delayRemaining : 0.01];

当我用下面的代码替换这行代码时,拖动工作正常,但访问效果不佳:

代码语言:javascript
运行
复制
[self performSelectorInBackground:@selector(setNeedsDisplay) withObject:nil];

这是什么原因呢?

EN

回答 3

Stack Overflow用户

发布于 2013-02-11 20:42:20

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

如果你的视图很慢,那么你需要安排在后台线程中做一些昂贵的事情,这将使在主线程中的绘制速度更快。

您调用的实际方法不会做太多事情;它只是将视图标记为重绘。这项工作仍然需要在drawRect方法中进行。

票数 1
EN

Stack Overflow用户

发布于 2013-02-11 21:08:24

因为drawRect方法只能在mainThread上工作。苹果公司的一份文件说,UIKit只能运行主线程。所以你需要在主线程中使用setNeedsLayout

票数 1
EN

Stack Overflow用户

发布于 2013-02-11 20:54:16

如果不是在主线程上调用,则正在更新的UIKit控件。因为UIKit类不是线程安全的。

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

代码语言:javascript
运行
复制
[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

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14812036

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档