5

Ich versuche, das CoreBluetooth-Framework zu verwenden, und ich habe eine Hilfsklasse (btHelper) erstellt, um Code wartbarer und so zu machen.Delegat nicht auf anderen Thread

Das Problem ist, dass in dieser Helper-Klasse die Delegate-Methoden nicht mehr so ​​aufgerufen werden, wie sie ursprünglich waren, als alles in große Klasse versetzt wurde. Ja, ich habe die Delegate-Methode in .h der Hilfsklasse festgelegt und ja, ich habe den Objekt CBCentralManager Delegat auf self gesetzt. Ich habe fast alles so gemacht wie in einer Klasse. Ich glaube, es hat etwas mit dem Hauptfaden zu tun, aber ich habe sehr wenig Erfahrung in diesem.

Insbesondere die delegierte Methode, die ich genannt will, ist

-(void)centralManagerDidUpdateState:(CBCentralManager *)central 

Kann jemand bitte sagen Sie mir, was ich tun muss delegieren Berufung zum Laufen zu bringen, wie es in dieser Hilfsklasse sollte? Danke!

Das Folgende ist die PrimaryViewController Klasse und die btHelper Klasse

btHelper.m

-(void) activateBluetooth 
{ 
self.manager= [[CBCentralManager alloc] initWithDelegate:self queue:nil]; 
} 

- (void)centralManagerDidUpdateState:(CBCentralManager *)central 
{ 
    //DELEGATE METHOD THAT NEVER GETS CALLED. SHOULD BE CALLED AS SOON AS self.manager is initiated 
    self.isAvailable=FALSE; 
    switch (central.state) { 
    case CBCentralManagerStatePoweredOff: 
     NSLog(@"CoreBluetooth BLE hardware is powered off"); 
     break; 
    case CBCentralManagerStatePoweredOn: 
     NSLog(@"CoreBluetooth BLE hardware is powered on and ready"); 
     self.isAvailable=TRUE; 
     break; 
    case CBCentralManagerStateResetting: 
     NSLog(@"CoreBluetooth BLE hardware is resetting"); 
     break; 
    case CBCentralManagerStateUnauthorized: 
     NSLog(@"CoreBluetooth BLE state is unauthorized"); 
     break; 
    case CBCentralManagerStateUnknown: 
     NSLog(@"CoreBluetooth BLE state is unknown"); 
     break; 
    case CBCentralManagerStateUnsupported: 
     NSLog(@"CoreBluetooth BLE hardware is unsupported on this platform"); 
     break; 
    default: 
     break; 
} 

} 

PrimaryViewController.m

-(IBAction)connect 
{ 
    btHelper *bluetoothManager= [[btHelper alloc]init]; 
    [bluetoothManager activateBluetooth]; 

} 
+0

Sind Sie sicher, dass Ihr Bluetooth-Manager tatsächlich etwas tut? Z.B. durch den Aufruf von 'scanForPeripheralsWithServices'? – Macondo2Seattle

+0

Kannst du einen Haltepunkt in deine IBAction setzen und sehen, ob sie stolpert? – Spectravideo328

+0

@BlackRider Die automatische Initialisierung eines CBCentralManager sollte die Delegate-Methode centralManagerDidUpdateState aufrufen. Diese Methode ist entscheidend für den Status von Bluetooth (z. B. ob Bluetooth LTE auf dem Gerät unterstützt wird). Von dort, und wenn Bluetooth aktiviert ist, kann man eine Methode wie scanForPeripheralWithServices anrufen – Teddy13

Antwort

13

Ihre Hilfsinstanz ist eine lokale Variable in der -connect-Methode. Also ARC veröffentlichen Sie es (und die CBCentralManager-Instanz), bevor Sie Delegate-Methoden empfangen können. Machen Sie Ihren Helfer eine Instanzvariable (oder Eigenschaft) von PrimaryViewController, und das wird Ihr Problem behoben.

@interface PrimaryViewController : UIViewController 
{ 
    // BTHelper instead of btHelper, to follow naming convention 
    BTHelper *_bluetoothManager; 
} 
@end 

@implementation PrimaryViewController 
    -(IBAction)connect 
    { 
     // FIXME: this don't check if _bluetoothManager is already instantiated 
     _bluetoothManager = [[BTHelper alloc] init]; 
     [_bluetoothManager activateBluetooth]; 
    } 
@end 
+0

Sie sind richtig! So ein einfacher Fehler! Vielen Dank! – Teddy13

+0

Hat das oben genannte gelöst? Ich stehe jetzt vor diesem Problem – sim

0

Stellen Sie sicher, dass Ihre btHelper.m die nehmen CBCentralManagerDelegate-Protokoll.

@interface btHelper() <CBCentralManagerDelegate> {} 

In Ihrem Fall oben, wahrscheinlich haben Sie keine Fehler mit dem Verfahren erhalten:

- (void)centralManagerDidUpdateState:(CBCentralManager *)central 

da wie von einigen Versionen vor, der Compiler erfordern gestoppt, dass Sie alle privaten Methoden erklären (im Schnittstellenbereich Ihrer .m-Datei).

Hoffe, das hilft.

+0

Danke für die Antwort! Ich habe das CBCentralManagerDelegate-Protokoll deklariert. Wie für den Rest Ihrer Antwort, sehe ich nicht, wie das dieser Situation hilft? Es wurde gerufen, als ich alles in einer Klasse durcheinander gebracht hatte, es musste egal was angerufen werden. Vielleicht vermisse ich Ihren Standpunkt (höchstwahrscheinlich der Fall).Wenn ich bin, können Sie bitte etwas mehr erklären? Danke – Teddy13

Verwandte Themen