Уведомление об обновлениях фонового потока 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)];

сам по себе не проблема, если я нажму на боттун, чтобы вызвать его, он работает!

но похоже, что это не работает в функции уведомления

Приветствую любой комментарий


person monsabre    schedule 10.11.2011    source источник


Ответы (1)


Вы публикуете уведомление из фоновой ветки.

Из документов NSNotificationCenter:

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

В многопоточном приложении уведомления всегда доставляются в потоке, в котором уведомление было опубликовано.

В вашем коде обработки уведомлений вы обновляете пользовательский интерфейс, который вы должны делать из основного потока. Попробуйте переместить этот код в другой метод, а затем в коде обработки уведомлений вызовите его с помощью PerformSelectorOnMainThread.

Другой вариант — НОД без уведомлений. Я разместил образец в этом S.O. отвечать:

GCD, потоки, программный поток и обновление пользовательского интерфейса

person bryanmac    schedule 10.11.2011