Как запустить собственный код в основном потоке приложений Какао

Я разработчик Windows, и мне сложно понять, как правильно запускать код в основном потоке NSApplication.

Большая часть моего кода выполняется в потоке cvdisplaylink (это приложение opengl). Проблема в том, что я не могу вызывать из него такие вещи, как NSOpenPanel - он вылетает из приложения и предупреждает о запуске подобных вещей только из основного потока.

Это нормально, но основной поток, насколько я понимаю, совершенно непрозрачен, и я могу заставить его делать что-то только с событиями. Метод sendAction NSApp казался многообещающим, потому что я мог явно указать, какой метод вызывать. Но он ничего не «отправил», он просто вызвал этот метод прямо из того же потока.

Я правильно понимаю? Должен ли я помещать какое-то настраиваемое событие (например, NSEventTypeApplicationDefined) в очередь основного потока, чтобы это работало правильно? И если да, как мне реагировать на такие настраиваемые события?


person Stas L    schedule 05.06.2020    source источник


Ответы (2)


Нравится:

dispatch_async(dispatch_get_main_queue(), ^{
   // do whatever
});
person matt    schedule 05.06.2020

Если вы хотите вызвать метод объекта Obj C, старый способ какао (который все еще работает) заключается в использовании performSelectorOnMainThread: withObject: waitUntilDone:

Например. чтобы скрыть окно, вызвав его метод «orderOut:», вы бы сделали это.

[theWindow performSelectorOnMainThread:@selector(orderOut:) 
                            withObject:nil 
                         waitUntilDone:NO];
person w0mbat    schedule 10.06.2020