2017-03-06 2 views
1

J'essaie de créer une application de ligne de commande qui utilise CoreBluetooth. Le problème est, il ne fonctionne pas sur les applications en ligne de commande.CoreBluetooth sur Mac Application de ligne de commande

J'ai déplacé le code my CoreBluetooth (une classe qui implémente le protocole CBCentralManagerDelegate - appelons cette classe myBLEManager) du projet d'application de ligne de commande vers une autre application graphique de Mac OS.

j'ai couru quelques tests ViewDidLoad() - supersample, j'init juste un myBLEManager qui crée une instance de CBCentralManager lors de l'initialisation, puis appelle scanForPeripherals.

C'est ce que je fais dans les projets CLI et GUI. La différence centralManagerDidUpdateState n'est jamais appelée dans le projet CLI. mais il le fait dans l'application GUI Mac.

+0

Est-ce que votre outil de ligne de commande ont une boucle d'exécution? – duskwuff

+0

@duskwuff, je ne sais pas. Merci pour l'indice, je vais regarder dans – kmn

+0

Voulez-vous poster une réponse? Ou devrais-je quand terminé? à vous – kmn

Répondre

2

Les rappels dans la plupart des frameworks Apple sont fournis via la boucle d'exécution principale de votre application. Si votre outil de ligne de commande n'a pas de boucle d'exécution, il ne peut pas recevoir les rappels qui sont envoyés de cette façon.

Sans un runloop, la seule façon pour le framework d'appeler votre callback serait de l'exécuter sur un autre thread, ce qui pourrait conduire à un comportement bizarre dans une application qui ne l'attendait pas.

, il suffit d'ajouter:

let runLoop = RunLoop.current 
let distantFuture = Date.distantFuture 
while running == true && runLoop.run(mode: RunLoopMode.defaultRunLoopMode, before: distantFuture) { 

} 
+0

pourriez-vous mettre à jour la réponse pour montrer un exemple plus détaillé de votre classe principale et de votre classe myBLEManager? – angryip

+0

@angryip Je n'ai pas écrit le programme. – duskwuff

+0

assez juste, je vais tendre la main à l'auteur – angryip