2010-12-29 7 views
2

내 앱에 주 스레드와 보조 스레드가 있습니다. 모두가 알고있는 주 스레드가 UI에서 사용 중입니다. 보조 뷰를 사용하여 백그라운드 뷰를로드합니다. 나는 더미 컨트롤러라고 부르는 메인 컨트롤러를 가지고있다. 거기에서 가로 모드의 주 컨트롤러를 호출합니다.보조 스레드에 관한 내용

기본적으로 내가 할 일은 더미 컨트롤러를 회전 할 때 내 메인 랜드 컨트롤러를로드 할 수 있고 그 반대도 마찬가지입니다.

더미에서 메인으로 회전 할 때 모든 것이 잘 작동합니다. 메인에는로드 할 하위 컨트롤러 시리즈가 있으므로 보조 스레드에이 프로세스를 적용하고 그 시간에로드하는 동안 로더 화면을 표시합니다.

더미는 일반보기 컨트롤러이며 기본은 모달보기 컨트롤러입니다.

이제 문제가 발생했습니다.

사용자가 dummy -> main 형식을 회전하려고하면 기본 뷰 컨트롤러 초기화의 rotate 메서드가 실행됩니다. 그러나 어떤 이유로 사용자가 마음을 바꾸고 주 -> 더미 형태로 이상적으로 회전하면 UI 스레드 (주 메모리)가 사용 가능하므로 전환이 원활해야합니다. UI가 다시 돌아 간다. 하지만 메인 컨트롤러의 보조 스레드가 계속 켜져 있기 때문에 기본 스레드가 MainController에서 모달 컨트롤러 해제를 요청한 후에도 willRotate 함수를 호출 할 때도 마찬가지입니다.

우리는 여러 가지 게시물을 읽었습니다. 우리는 스스로를 정리해야하므로 2 차 스레드를 죽일 수는 없습니다. 그래서 아무도 코드를 통해 나를 안내 해줄 수 있습니다, 어떻게 내 보조 스레드를 죽이고 다시 내 호출 양식으로 이동하기 전에 정리합니까 .. ?? 다소 긴급합니다 ... 다른 스레드 주제를 가리 키지 마십시오. 이미 이미 방문했기 때문입니다.

나는 구체적으로 충돌을 일으키지 않고 보조 스레드를 중단해야하는 방법을 알고 싶습니다. 덕분에 .

-(void)viewDidLoad { 

[super viewDidLoad]; 

workingThread = [[NSThread alloc]initWithTarget:self selector:@selector(parseMainTextFile) object:nil]; 

[workingThread start]; 

[NSThread detachNewThreadSelector:@selector(addLoader) toTarget:self withObject:nil]; 
    //[self performSelectorOnMainThread:@selector(parseMainMatchTextFile) withObject:nil waitUntilDone:NO]; 

} 
+1

"[내보기] 배경로드"는 무엇을 의미합니까? UIKit은 스레드 안전하지 않습니다 (극히 일부 경우 제외). 다른 스레드에서보기를로드하는 것은 안전하지 않습니다. –

+0

죄송합니다 올바른 단어는 내보기의 배경 초기화 것입니다. – swapnil

+0

질문을 편집했습니다. 여기 작업 스레드는 제 2 스레드입니다. 그리고 parseMainTextFile :은 스레드 시작 함수입니다. 이 메소드에는, 아이 컨트롤을 초기화하는 일련의 메소드가 있습니다. 희망 장면이 조금 더 선명합니다. – swapnil

답변

2

일반적으로 말하자면, 백그라운드 스레드를 실행하면 while 루프에서 실행되는 실행 루프가 있다는 의미입니다. Run Loop를 멈추게하는 플래그가 있어야합니다. 이 방법은 스레드의 상태를 완료로 변환합니다.

while (mRunLoop && [mLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]); 

이것은 내가하는 방법입니다. 또한이 Post 및 주석에서 해당 하위 게시물을 읽어보십시오. 행운을 빕니다!

+0

음 ... 감사합니다.하지만 시나리오를 보여주는 스 니펫을 게시 할 수 있습니까? 나는 그것을 충분히 이해하지 못했습니다. – swapnil

+0

이것은 나를 위해 작동하는 방법입니다 : NSRunLoop * mLoop = [NSRunLoop currentRunLoop]; \t \t self.animationTimer = [NSTimer scheduledTimerWithTimeInterval : animationInterval 대상 : 셀렉터 : @selector (drawView) userInfo : nil 반복 : YES]; \t \t mRunLoop = YES; \t while (![[NSThread currentThread] isCancelled] && mRunLoop && [mLoop runMode : NSDefaultRunLoopMode beforeDate : [NSDate distantFuture]]); –

+0

음 ... 혼돈 스러울 때도 있습니다. 여기에서 무슨 일이 일어나고 있는지 자세히 설명해 주시겠습니까 ?? – swapnil