为了提高性能,我在后台线程中为滚动视图创建子视图,然后使用performSelectorOnMainThread
将事件发布到主线程,并将视图添加到其中的scrollview中并将其添加到字体中。但是我有时会崩溃。
当我在后台线程中检查时。
if( nil == myView.view.superview)
如何在后台线程中执行此检查线程安全。如果我必须在主线程上执行然后我需要更改设计,因此可以有一种方法我将其发布到主线程并使用返回值。 我对这些替代品持开放态度。
TIA,
Praveen S
编辑:
我已经使用分页实现了UIScrollview。但是由于性能问题和提高UI的响应能力,我使用
创建了子视图到不同的线程[self performSelectorInBackground:@selector(loadPages:) withObject:nil];
在加载页面中,我执行以下操作
if( nil == myView.view.superview)
{
Create the view
[[self performSelectorOnMainThread:@selector(refreshViews:) myView.view waitUntilDone:YES];
}
在刷新视图中,我将子视图添加到scrollview并将其置于最前面。
[myScrollView addSubview:views];
[myScrollView bringSubviewToFront:views];
然而,添加和页面控制工作正常。滚动就可以了。但是当我快速滚动它(以快速方式在屏幕上滑动)时,应用程序崩溃了。
调试器表示在ifp检查加载页后崩溃是在obj_msgSend。
编辑:堆栈跟踪 - 这次检查@synchronize时崩溃了。出于安全原因,我已编辑崩溃日志以删除项目特定名称,但跟踪如下所示。
#0 0x33a06464 in objc_msgSend ()
#1 0x314d6984 in -[UIViewController _loadViewFromNibNamed:bundle:] ()
#2 0x314d5cb8 in -[UIViewController loadView] ()
#3 0x313d6226 in -[UIViewController view] ()
#6 0x00009920 in -[myViewController loadPages:] (self=0x12a2a0, _cmd=0x1eac1, abcd=0x0) at
#7 0x302d9198 in -[NSThread main] ()
#8 0x302d2248 in __NSThread__main__ ()
#9 0x3110c88c in _pthread_start ()
#10 0x31101a90 in thread_start ()
答案 0 :(得分:1)
除非另有特别说明,否则UIKit不是线程安全的。不支持在后台创建视图(和加载笔尖);触及UIView的任何东西都需要在主线程上发生。即使在将视图添加到超级视图之前,这也适用。