我在NSOperationQueue派生的队列上使用了renderInContext来完成这个,但是注意它很慢.
所以,我已经开始使用drawVIEwHIErarchyInRect,它工作得很好而且速度更快.但是,我注意到当这个方法以b / g运行时,我的UI完全阻塞.
如果我在主线程上执行此 *** 作…
UIVIEw *prevIEw = [[UIVIEw alloc]initWithFrame:CGRectMake(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,100)]; prevIEw.backgroundcolor = [UIcolor redcolor]; UIGraphicsBeginImageContextWithOptions(prevIEw.bounds.size,0.0); BOol ok = [prevIEw drawVIEwHIErarchyInRect:prevIEw.bounds afterScreenUpdates:YES]; UIImage *img = nil; if( ok ) { img = UIGraphicsGetimageFromCurrentimageContext(); } UIGraphicsEndImageContext();} dispatch_semaphore_signal(semaphore); });
…我的用户界面冻结,完全执行后.
‘ok’返回YES,所以一切似乎都有效.
如果我将afterUpdates设置为NO,则’ok’为NO(失败),但UI仍然是响应式的.
使用drawVIEwHIErarchyInRect除主线程以外的任何东西都有任何限制吗?
解决方法 UIKit对象只应在主线程上进行 *** 作. Apple的 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全部内容,希望文章能够帮你解决ios – 后台线程上的drawViewHierarchyInRect所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)