UIScrollview中的后台线程崩溃

时间:2011-03-04 07:00:16

标签: iphone objective-c multithreading performance uiscrollview

为了提高性能,我在后台线程中为滚动视图创建子视图,然后使用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 ()

1 个答案:

答案 0 :(得分:1)

除非另有特别说明,否则UIKit不是线程安全的。不支持在后台创建视图(和加载笔尖);触及UIView的任何东西都需要在主线程上发生。即使在将视图添加到超级视图之前,这也适用。