2013-12-18 26 views
5

CoreBluetooth framework'ü kullanmaya çalışıyorum ve kodun daha iyi korunmasını sağlamak için bir yardımcı sınıf (btHelper) oluşturdum. Sorun, bu yardımcı sınıfta, delege yöntemlerinin artık her şeyin büyük bir sınıfa sokulduğu gibi orijinal olarak adlandırılmalarıdır. Evet Delege yöntemini yardımcı sınıfın .h bölümünde ayarlamıştım ve evet CBCentralManager temsilcisini kendi kendine ayarlamıştım. Her şeyi bir sınıfta olduğu gibi hemen hemen herşeyi yaptım. Ana iş parçacığı ile ilgili bir şey olduğuna inanıyorum ama bu konuda çok az deneyimim var.Temsilci farklı iş parçacığı üzerinde çağrılmadı

Özellikle, denilen istediğim temsilci yöntemi

-(void)centralManagerDidUpdateState:(CBCentralManager *)central 

kimse bu yardımcı sınıfında olması gerektiği gibi çalışan temsilci çağrı almak için ne yapması gerektiğini söyleyebilir misin nedir? Teşekkürler!

PrimaryViewController sınıf ve btHelper sınıf

btHelper.m aşağıdaki

-(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 yöneticinizin gerçekten bir şey yaptığını emin misiniz? Örneğin. scanForPeripheralsWithServices işlevini çağırarak? – Macondo2Seattle

+0

IBAction'ınıza bir kesme noktası koyabilir ve açılıp açılmadığını görebilir misiniz? – Spectravideo328

+0

@ BlackRider Bir CBCentralManager'ın başlatılması, otomatik olarak centralManagerDidUpdateState temsilci yöntemini çağırmalıdır. Bu yöntem, Bluetooth durumunu belirlemede çok önemlidir (örn. Bluetooth LTE'nin cihazda desteklenip desteklenmediği). Oradan, ve bluetooth etkinleştirildiğinde, bir tarama gibi bir yöntem çağırabilirForPeripheralWithServices – Teddy13

cevap

13

Yardımcı örnek, -connect yönteminde yerel bir değişkendir. Bu nedenle, temsilci yöntemlerini alabilmeniz için ARC'yi (ve CBCentralManager örneğini) serbest bırakın. Yardımcınızı PrimaryViewController'ın bir örnek değişkenini (veya özelliğini) yapın ve bu sorunu çözecektir.

@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

Haklısınız! bu kadar basit bir hata! Teşekkür ederim! – Teddy13

+0

Yukarıdaki sorun mu çözüldü? Şimdi bu problemle karşı karşıyayım – sim

0

sizin btHelper.m benimsemek emin olun CBCentralManagerDelegate protokolü. Yukarıdaki durumda

@interface btHelper() <CBCentralManagerDelegate> {} 

, büyük olasılıkla yöntemiyle herhangi bir hata alamadım:

- (void)centralManagerDidUpdateState:(CBCentralManager *)central 

birkaç sürüm önce itibariyle derleyici herhangi özel yöntemler beyan gerektiren durdu beri (.m dosyanızın arayüz bölümünde).

Bu yardımcı olur umarım.

+0

Yanıt için teşekkürler! CBCentralManagerDelegate protokolünü bildirdim. Cevabınızın geri kalanı için, bu durumun nasıl yardımcı olduğunu görmüyorum? Her şeyi bir sınıfta karıştırdığım zaman aradı, ne olursa olsun çağrılmalı. Belki senin noktanı kaçırırım (büyük ihtimalle dava).Eğer öyleysem, biraz daha açıklayabilir misiniz? Teşekkürler – Teddy13

İlgili konular