2011-03-04 95 views
0

爲了提高性能,我在後臺線程中爲我的滾動視圖創建子視圖,然後使用performSelectorOnMainThread將事件發佈到主線程,並將視圖添加到其中的滾動視圖中並將其添加到字體中。不過,我有時會遇到碰撞。在UIScrollview的後臺線程中崩潰

當我檢查我的後臺線程。

if(nil == myView.view.superview) 

如何在後臺線程中執行此檢查線程安全。如果我必須在主線程上執行,那麼我需要更改設計,因此可以有辦法將它發佈到主線程並使用返回值。 我對同樣的選擇開放。

TIA,

普利文小號

編輯:

我已經實現UIScrollView的分頁。然而,由於性能問題,並提高用戶界面的響應我移動創建子視圖到使用

[self performSelectorInBackground:@selector(loadPages:) withObject:nil]; 

在網頁加載不同的線程,我這樣做

if(nil == myView.view.superview) 
{ 
Create the view 
[[self performSelectorOnMainThread:@selector(refreshViews:) myView.view waitUntilDone:YES]; 
} 

在刷新視圖我添加子視圖滾動視圖,並把它放在前面。

[myScrollView addSubview:views]; 
[myScrollView bringSubviewToFront:views]; 

但是,獲取添加和頁面控制工作正常。滾動是好的,確實很順利。但是,當我快速滾動(快速滑過屏幕)應用程序崩潰。

調試器說崩潰發生在負載頁面if檢查後的obj_msgSend。

編輯:堆棧跟蹤 - 它崩潰在這次檢查@synchronized。出於安全原因,我編輯了崩潰日誌以刪除項目特定的名稱,但跟蹤如下所示。

#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

除非另有特別說明,否則UIKit不是線程安全的。不支持在後臺創建視圖(並加載nib);任何接觸UIView的東西都需要在主線程中發生。即使在您的視圖添加到超級視圖之前,這也適用。

+0

那麼我如何加快我的應用程序的響應速度?你可以請回答我的問題在這裏.. http://stackoverflow.com/questions/5133731/how-to-make-ui-responsive-all-the-time-and-do-background-updating – 2011-03-04 09:01:17

相關問題