Я (наконец) понял это. MultipeerConnectivity нужен цикл выполнения. Это не в документации.
Я предположил, что API MultipeerConnectivity создал потоки и / или циклы, необходимые для вызова метода [browser startBrowsingForPeers]
. Это не так.
Нигде в этом коде не запущен цикл выполнения. Также, что довольно интересно, использование NSThread напрямую не запускает цикл выполнения, хотя подразумевает, что он будет :
Ваше приложение не создает и не управляет NSRunLoop явным образом
объекты. Каждый объект NSThread, включая основной
поток - имеет объект NSRunLoop, автоматически создаваемый для него по мере необходимости.
Если вам нужен доступ к циклу выполнения текущего потока, вы делаете это с помощью
метод класса currentRunLoop.
Что создаст цикл выполнения (и запустит его): CFRunLoopRun()
:
Цикл выполнения текущего потока выполняется в режиме по умолчанию (см. Default
Run Loop Mode), пока цикл выполнения не будет остановлен с помощью CFRunLoopStop или всех
источники и таймеры удалены из режима цикла выполнения по умолчанию.
Что остановит это, то это CFRunLoopStop(CFRunLoopRef rl)
:
Эта функция заставляет rl прекратить работу и вернуть управление
функция, которая называется CFRunLoopRun или CFRunLoopRunInMode для
Активация токовой петли.
Конечно, CFRunLoopStop
принимает CFRunLoopRef
в качестве аргумента. Вы можете получить это, используя CFRunLoopGetCurrent
, просто помните, что это ссылка и срок ее действия может истечь в любое время. Я думаю, вы можете быть уверены, что цикл выполнения не прекратится, пока вы находитесь в обратном вызове, который выполняется в цикле выполнения. Но я бы не стал рассчитывать на то, что оно останется после. На самом деле, в этом случае, весь смысл в том, чтобы убить его на этом этапе; так что я ожидаю, что это уйдет.