Мне нужно изображение в какао, дизайн, который опирается на несколько потоков.Отправка сообщений в поток?
я начал на уровне CoreFoundation - я создал CFMessagePort и прикрепил его к CFRunLoop, но это было очень неудобно, так как (в отличие от других платформ) это необходимо иметь (общесистемное) уникальное имя, и CFMessagePortSendRequest делает не обрабатывать обратные вызовы обратно к текущему потоку во время ожидания. Его можно создать собственный объект CFRunLoopSource, но построение собственной потоковой очереди по очереди кажется излишним.
Затем я переключился с использования потоков POSIX на NSThreads, вызывая функцию executeSelector: onThread: для отправки сообщений в другие потоки. Это намного проще в использовании, чем механизм CFMessagePort, но опять-таки, performSelector: onThread: не позволяет основному потоку отправлять сообщения обратно в текущий поток - и нет никакого возвращаемого значения.
Все, что мне нужно - это простой механизм inprocess (поэтому, надеюсь, не нужно изобретать схемы для создания уникальных имен), что позволяет мне отправлять сообщение (и ждать ответа) из потока A в поток B, и, ожидая сообщения, разрешите потоку B отправить сообщение (и дождитесь ответа) в/из потока A.
Прост: вызовы B повторно подключаются. Ситуация, обычная для один поток, но это тупиковый ад, когда сообщения находятся между потоками.
Проблема с performSelectorOnThread: withObject: waitUntilDone: заключается в том, что при ожидании он не обрабатывает вызовы ONTO текущего потока. По крайней мере, в моих тестах это не так. то есть, если поток A выполняетSelectorOnThread: B, то B должен иметь возможность выполнятьSelectorOnThread: A как часть своей работы. –
Но я буду использовать +1 для элегантного использования NSInvocation. –
@ Крис Бекке: Я добавил материал, чтобы не ждать. По сути, если вы хотите не ждать и иметь возвращаемое значение, ваш второй поток должен возвращать исходный поток. Вы не можете этого избежать. – JeremyP