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];
}
Czy upewniasz się, że menedżer bluetooth rzeczywiście coś robi? Na przykład. przez wywołanie 'scanForPeripheralsWithServices'? – Macondo2Seattle
Czy możesz umieścić punkt przerwania w swojej IBAction i sprawdzić, czy to potknie się? – Spectravideo328
@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