gpt4 book ai didi

ios - drawViewHierarchyInRect 在后台线程

转载 作者:可可西里 更新时间:2023-11-01 03:18:40 25 4
gpt4 key购买 nike

我正在尝试在后台线程上执行一些“屏幕外渲染”,以更新我正在创建的类似设计器的应用程序的预览。

我在 NSOperationQueue 派生队列上使用 renderInContext 来完成此操作,但请注意它很慢。

因此,我开始使用 drawViewHierarchyInRect,它运行良好且速度更快。但是,我注意到当此方法在 b/g 中运行时,我的 UI 完全阻塞。

如果我在主线程上这样做...

    UIView *preview = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 100, 100)];
preview.backgroundColor = [UIColor redColor];

UIGraphicsBeginImageContextWithOptions(preview.bounds.size, NO, 0.0);

BOOL ok = [preview drawViewHierarchyInRect:preview.bounds afterScreenUpdates:YES];

UIImage *img = nil;

if( ok )
{
img = UIGraphicsGetImageFromCurrentImageContext();
}

UIGraphicsEndImageContext();

...一切正常。

但是,如果我(说)发送这个...

if (dispatch_semaphore_wait(semaphore, DISPATCH_TIME_NOW) == 0) 
{
dispatch_async(renderQueue, ^{
// capture
UIView *preview = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 100, 100)];
preview.backgroundColor = [UIColor redColor];

UIGraphicsBeginImageContextWithOptions(preview.bounds.size, NO, 0.0);

BOOL ok = [preview drawViewHierarchyInRect:preview.bounds afterScreenUpdates:YES];

UIImage *img = nil;

if( ok )
{
img = UIGraphicsGetImageFromCurrentImageContext();
}

UIGraphicsEndImageContext();
}
dispatch_semaphore_signal(semaphore);
});

...我的 UI 在执行后完全卡住。

'ok' 返回 YES,所以一切似乎都正常。

如果我将 afterUpdates 设置为 NO,“ok”为 NO(失败),但 UI 继续响应。

在主线程之外使用 drawViewHierarchyInRect 是否有任何限制?

最佳答案

UIKit 对象只能在主线程上操作。苹果的UIKit documentation提到这句话

For the most part, use UIKit classes only from your app’s main thread. This is particularly true for classes derived from UIResponder or that involve manipulating your app’s user interface in any way.

关于ios - drawViewHierarchyInRect 在后台线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24514719/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com