2011-11-10 80 views
1

有一個任務需要在NSView上繪製N個圖像。 但是在開始時我不知道圖像的數量,所以我將它設置在背景線程中。後臺線程更新通知NSView

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

,當它獲得的圖像的數量,它會發送通知

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

//get image amount.... 

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

//... 
//continue to load images 

} 

我嘗試調整的NSView取決於圖像的通知功能

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

    //others codes 

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

    //others codes 

} 

量但當應用程序執行線A時,它會凍結,

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

本身沒有問題,如果我點擊一個bottun來調用它,它的工作原理!

但它看起來像它不通知功能

工作,歡迎任何評論

回答

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