2011-03-04 11 views
0

성능을 향상시키기 위해 백그라운드 스레드에서 내 스크롤보기의 하위보기를 만든 다음 performSelectorOnMainThread을 사용하여 메인 스레드에 이벤트를 게시하고 뷰를 스크롤 막대에 추가하여 글꼴로 가져옵니다. . 그러나 나는 때때로 충돌을 얻는다.UIScrollview의 백그라운드 스레드에서 크래시

내 백그라운드 스레드에서이를 확인할 때.

if(nil == myView.view.superview) 

이 검사 스레드는 백그라운드 스레드에서 안전하게 수행 할 수 있습니다. 내가 메인 스레드에서 수행해야한다면, 디자인을 많이 바꿀 필요가있다. 그러므로 메인 스레드에 게시하고 리턴 값을 사용하는 방법이있을 수있다. 나는 동일한 것에 대한 대안을 공개하고있다.

TIA,

프라 빈 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]; 
} 

를 다음을 수행 내가 추가 스크롤 뷰로 하위 뷰를 가져 와서 앞으로 가져옵니다.

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

그러나 추가 및 페이지 컨트롤이 정상적으로 작동합니다. 스크롤은 괜찮아 종류 부드럽게. 하지만 빠르게 스크롤하면 (화면을 빠르게 스 와이프) 응용 프로그램이 충돌합니다.

loadpages에서 if 체크 후 충돌이 obj_msgSend에 있다고 디버거가 말합니다.

EDIT : 스택 추적 - 이번에는 @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은 별도로 명시하지 않는 한 스레드로부터 안전하지 않습니다. 백그라운드에서 뷰 (및로드 펜촉)를 작성하는 것은 지원되지 않습니다. UIView를 만지는 것은 주 스레드에서 발생해야합니다. 보기가 수퍼 뷰에 추가되기 전에도 적용됩니다.

+0

그렇다면 응용 프로그램의 응답 속도를 어떻게 높일 수 있습니까? 내 질문에 여기에 회신 해 주시겠습니까 .. http://stackoverflow.com/questions/5133731/how-to-make-ui-responsive-all-the-time-and-do-background-updating –

관련 문제