2011-11-10 1 views
1

NSView에서 N 개의 이미지를 그릴 필요가 있습니다. 하지만 처음에는 이미지의 양을 알지 못하기 때문에 백그라운드의 스레드에서 작동하도록 설정했습니다.백그라운드 스레드 업데이트에 대한 알림 NSView

[NSThread detachNewThreadSelector:@selector(workInBackgroundThread:) toTarget:self withObject:nil]; 

는 이미지의 양을 얻을 때, 그것은 내가 NSView의 알림 기능

-(void)processGotImagesAmount:(NSNotification*)notification 
{ 

    //others codes 

    [myNSView setFrame:CGRectMake(0, 0, calculateNewWidth, caculatedNewHeight)];//line A 

    //others codes 

} 

에서 이미지의 양에 따라 크기를 조정하려고 통지

- (void)workInBackgroundThread:(id)unusedObject { 
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

//get image amount.... 

[[NSNotificationCenter defaultCenter] postNotificationName:@"gotImageAmount" object:nil]; 

//... 
//continue to load images 

} 
를 보내드립니다 앱이 라인 A를 실행하면 화면이 멈추는 현상이 발생합니다.

[myNSView setFrame:CGRectMake(0, 0, calculateNewWidth, caculatedNewHeight)]; 

자체는 아무 문제가 없습니다. 전화를 걸려면 botun을 클릭하면 작동합니다!

하지만 알림 기능

에서 작동하지 않는 것 같습니다 어떤 의견

답변

7

당신은 백그라운드 스레드에서 통지를 게시하는에게 오신 것을 환영합니다. NSNotificationCenter의 문서에서

: 다중 스레드 응용 프로그램에서

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nsnotificationcenter_Class/Reference/Reference.html

알림은 항상 알림 코드를 처리 알림에서

을 게시하는 스레드에 전달 당신은 메인 스레드에서해야만하는 UI를 업데이트하고 있습니다. 해당 코드를 다른 메서드로 이동 한 다음 알림 처리 코드에서 performSelectorOnMainThread로 호출하십시오.

또 다른 옵션은 알림없이 GCD입니다. 나는이 S.O.에 샘플을 올렸다. 답변 :

GCD, Threads, Program Flow and UI Updating