5

Próbuję użyć struktury CoreBluetooth i utworzyłem klasę pomocniczą (btHelper), aby kod był łatwiejszy do utrzymania i taki.Delegat nie jest wywoływany w innym wątku

Problem polega na tym, że w tej klasie pomocniczej metody delegatów nie są już wywoływane tak, jak pierwotnie, gdy wszystko zostało zmiażdżone na dużą klasę. Tak Ustawiłem metodę delegata w .h klasy pomocniczej i tak, ustawiłem delegata obiektu CBCentralManager na siebie. Zrobiłem prawie wszystko tak samo, jak wtedy, gdy wszystko było w jednej klasie. Wierzę, że ma coś wspólnego z głównym wątkiem, ale mam bardzo małe doświadczenie w tym.

szczególności, metoda delegata, że ​​chcę nazywany jest

-(void)centralManagerDidUpdateState:(CBCentralManager *)central 

Czy ktoś może mi powiedzieć, co mam czynić, aby otrzymać powołanie delegata pracuje tak jak powinien w tej klasie pomocnika? Dzięki!

Poniżej klasa PrimaryViewController a klasa btHelper

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

Czy upewniasz się, że menedżer bluetooth rzeczywiście coś robi? Na przykład. przez wywołanie 'scanForPeripheralsWithServices'? – Macondo2Seattle

+0

Czy możesz umieścić punkt przerwania w swojej IBAction i sprawdzić, czy to potknie się? – Spectravideo328

+0

@BlackRider Inicjowanie menedżera CBCentralManager powinno automatycznie wywoływać metodę delegata centralManagerDidUpdateState. Ta metoda ma kluczowe znaczenie przy określaniu stanu Bluetooth (np. Czy w urządzeniu jest obsługiwane urządzenie Bluetooth LTE). Stamtąd i jeśli włączony jest bluetooth, można wywołać metodę taką jak scanForPeripheralWithServices – Teddy13

Odpowiedz

13

Instancja pomocnicza jest lokalną zmienną w metodzie -connect. W związku z tym ARC zwolnij go (i instancję CBCentralManager), zanim będzie można odbierać metody delegowania. Ustaw pomocnika jako zmienną instancji (lub właściwość) obiektu PrimaryViewController, co rozwiąże problem.

@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

Masz rację! taki prosty błąd! Dziękuję Ci! – Teddy13

+0

Czy powyższe rozwiązanie zostało rozwiązane? Mam teraz do czynienia z tym problemem – sim

0

Upewnij się, że btHelper.m przyjąć CBCentralManagerDelegate protocol.

@interface btHelper() <CBCentralManagerDelegate> {} 

W twoim przypadku powyżej, najprawdopodobniej nie dostać żadnych błędów metodą:

- (void)centralManagerDidUpdateState:(CBCentralManager *)central 

ponieważ jak kilku wersjach temu, kompilator zatrzymał wymagając, aby zadeklarować żadnych metod prywatnych (w sekcji interfejsu pliku .m).

Mam nadzieję, że to pomoże.

+0

Dzięki za odpowiedź! Deklarowałem protokół CBCentralManagerDelegate. Co do reszty odpowiedzi, nie widzę, jak to pomaga w tej sytuacji? Zostało to wywołane, gdy miałem wszystko wymieszane w jednej klasie, to musi być wywołane bez względu na wszystko. Być może brakuje mi twojego punktu (najprawdopodobniej w tym przypadku).Jeśli tak, czy możesz wyjaśnić coś jeszcze? Dzięki – Teddy13

Powiązane problemy