2013-12-18 10 views
5

私はCoreBluetoothフレームワークを使用しようとしており、コードをより保守性の高いものにするためにヘルパークラス(btHelper)を作成しました。代理人が別のスレッドで呼び出されていない

問題は、このヘルパークラスでは、デリゲートメソッドは、すべてがビッグクラスにスムージングされたときの元のように呼び出されなくなりました。はい、ヘルパークラスの.hでデリゲートメソッドを設定しています。はい、CBCentralManagerデリゲートをselfに設定しています。私は、すべてが1つのクラスに入っていたときとほとんど同じことをしました。 私はそれがメインスレッドと関係があると信じていますが、私はこれについてほとんど経験がありません。

具体的には、呼ばれる私が欲しいデリゲートメソッドは

-(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]; 

} 
+0

あなたのBluetoothマネージャーが実際に何かをしていることを確認していますか?例えば。 'scanForPeripheralsWithServices'を呼び出すことによって? – Macondo2Seattle

+0

IBActionにブレークポイントを設定して、トリップしているかどうか確認できますか? – Spectravideo328

+0

@BlackRider CBCentralManagerを自動的に開始すると、デリゲートメソッドcentralManagerDidUpdateStateを呼び出す必要があります。この方法は、Bluetoothの状態を判断する際に重要です(たとえば、Bluetooth LTEがデバイスでサポートされているかどうか)。そこから、ブルートゥースが有効な場合、scanForPeripheralWithServicesのようなメソッドを呼び出すことができます – Teddy13

答えて

13

ヘルパーインスタンスは、-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 
+0

あなたは正しいです!そんな単純な間違い!ありがとうございました! – Teddy13

+0

上記は解決しましたか?私は今この問題に直面している – sim

0

あなたbtHelper.mを採用していることを確認してくださいCBCentralManagerDelegateプロトコル。上記のあなたのケースでは

@interface btHelper() <CBCentralManagerDelegate> {} 

、最も可能性が高いあなたは、メソッドですべてのエラーを取得できませんでした:

- (void)centralManagerDidUpdateState:(CBCentralManager *)central 

数バージョン前のように、コンパイラはあなたが任意のプライベートメソッドを宣言することを要求することを停止するので( .mファイルのインタフェースセクションにあります)。

これが役に立ちます。

+0

ありがとう!私はCBCentralManagerDelegateプロトコルを宣言しました。あなたの答えの残りの部分については、私はそれがこの状況にどのように役立つのか分かりません。 1つのクラスですべてが混乱したときに呼び出されました。何があっても呼び出される必要があります。おそらく、私はあなたの意見が不足している可能性が高いでしょう。私がいれば、もう少し説明してもらえますか?ありがとう – Teddy13

関連する問題