【问题标题】:Delegate not called on different thread未在不同线程上调用委托
【发布时间】:2014-01-06 00:17:33
【问题描述】:

我正在尝试使用 CoreBluetooth 框架,并且我创建了一个帮助类 (btHelper) 以使代码更易于维护等。

问题在于,在这个帮助类中,委托方法不再像原来那样被调用,当所有东西都被压缩到大类中时。是的,我已经在助手类的 .h 中设置了委托方法,是的,我已经将对象 CBCentralManager 委托设置为 self。我所做的几乎所有事情都和在一个班级里时一样。 我相信它与主线程有关,但我在这方面的经验很少。

具体来说,我要调用的委托方法是

-(void)centralManagerDidUpdateState:(CBCentralManager *)central 

谁能告诉我我必须做什么才能让委托调用在这个助手类中正常工作? 谢谢!

以下是PrimaryViewController类和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];

}

【问题讨论】:

  • 您确定您的蓝牙管理器确实在做某事吗?例如。致电scanForPeripheralsWithServices?
  • 你能在你的 IBAction 中放一个断点,看看它是否跳闸吗?
  • @BlackRider 自动启动 CBCentralManager 应该调用委托方法 centralManagerDidUpdateState。此方法对于确定蓝牙状态至关重要(例如,设备是否支持蓝牙 LTE)。从那里,如果启用了蓝牙,则可以调用类似 scanForPeripheralWithServices 的方法
  • @Spectravideo328 绊倒是什么意思?崩溃?我已经放置了断点,除了没有调用委托方法外,一切都按原样进行。还有其他建议吗?谢谢

标签: ios objective-c delegates core-bluetooth cbcentralmanager


【解决方案1】:

你的助手实例是-connect 方法中的一个局部变量。 因此 ARC 在您接收委托方法之前释放它(以及 CBCentralManager 实例)。 让您的助手成为 PrimaryViewController 的实例变量(或属性),这将解决您的问题。

@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

【讨论】:

  • 以上解决了吗?我现在正面临这个问题
【解决方案2】:

确保您的 btHelper.m 采用 CBCentralManagerDelegate 协议。

@interface btHelper () <CBCentralManagerDelegate> {}

在上述情况下,很可能您的方法没有出现任何错误:

- (void)centralManagerDidUpdateState:(CBCentralManager *)central

从几个版本开始,编译器不再要求您声明任何私有方法(在 .m 文件的接口部分中)。

希望这会有所帮助。

【讨论】:

  • 感谢您的回复!我确实声明了 CBCentralManagerDelegate 协议。至于您的其余答案,我看不出这对这种情况有何帮助?当我把所有东西都混在一个班级里时,它就被调用了,无论如何都必须调用它。也许我错过了你的观点(很可能是这种情况)。如果我是,你能再解释一下吗?谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-21
  • 1970-01-01
  • 1970-01-01
  • 2018-01-11
  • 2020-02-14
相关资源
最近更新 更多