2013-12-18 16 views
5

Tôi đang cố gắng sử dụng khung CoreBluetooth và tôi đã tạo một lớp trợ giúp (btHelper) để làm cho mã dễ bảo trì hơn và như vậy.Đại biểu không được gọi theo chủ đề khác nhau

Vấn đề là trong lớp trợ giúp này, các phương thức đại biểu không còn được gọi như ban đầu khi mọi thứ được smushed vào lớp lớn. Có, tôi đã thiết lập phương thức ủy nhiệm trong .h của lớp helper và có tôi đã đặt đối tượng CBCentralManager delegate thành self. Tôi đã làm khá nhiều thứ giống như khi tất cả trong một lớp. Tôi tin rằng nó có một cái gì đó để làm với các chủ đề chính nhưng tôi có rất ít kinh nghiệm trong việc này.

Cụ thể, phương pháp đại biểu mà tôi muốn gọi là

-(void)centralManagerDidUpdateState:(CBCentralManager *)central 

bất cứ ai có thể vui lòng cho tôi biết tôi phải làm gì để có được sự kêu gọi đại biểu làm việc như nó nên trong lớp helper này? Cảm ơn!

Sau đây là lớp PrimaryViewController và lớp 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

Bạn có chắc chắn rằng trình quản lý bluetooth của bạn thực sự làm điều gì đó không? Ví dụ. bằng cách gọi 'scanForPeripheralsWithServices'? – Macondo2Seattle

+0

Bạn có thể đặt điểm ngắt trong IBAction của mình và xem liệu nó có bị vấp ngã không? – Spectravideo328

+0

@BlackRider Khởi tạo một CBCentralManager tự động nên gọi phương thức ủy nhiệm centralManagerDidUpdateState. Phương pháp này rất quan trọng trong việc xác định trạng thái Bluetooth (Ví dụ: Bluetooth LTE có được hỗ trợ trên thiết bị không). Từ đó, và nếu bluetooth được bật, người ta có thể gọi một phương thức như scanForPeripheralWithServices – Teddy13

Trả lời

13

Ví dụ trình trợ giúp của bạn là biến cục bộ theo phương pháp -connect. Vì vậy, ARC phát hành nó (và cá thể CBCentralManager) trước khi bạn có thể nhận các phương thức ủy nhiệm. Làm cho trình trợ giúp của bạn trở thành biến thể (hoặc thuộc tính) của PrimaryViewController và điều này sẽ khắc phục được sự cố của bạn.

@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

Bạn chính xác! một sai lầm đơn giản như vậy! Cảm ơn bạn! – Teddy13

+0

Đã giải quyết ở trên? Tôi đang đối mặt với vấn đề này ngay bây giờ – sim

0

Đảm bảo rằng btHelper.m của bạn thông qua CBCentralManagerGiao thức đại biểu.

@interface btHelper() <CBCentralManagerDelegate> {} 

Trong trường hợp bạn ở trên, rất có thể bạn đã không nhận được bất kỳ lỗi nào với phương pháp:

- (void)centralManagerDidUpdateState:(CBCentralManager *)central 

kể từ khi một vài phiên bản trước, trình biên dịch ngừng đòi hỏi mà bạn khai báo bất kỳ phương pháp tư nhân (trong phần giao diện của tệp .m của bạn).

Hy vọng điều này sẽ hữu ích.

+0

Cảm ơn bạn đã phản hồi! Tôi đã khai báo giao thức CBCentralManagerDelegate. Đối với phần còn lại của câu trả lời của bạn, tôi không thấy làm thế nào mà giúp tình trạng này? Nó được gọi khi tôi có mọi thứ lộn xộn trong một lớp, nó phải được gọi là không có vấn đề gì. Có lẽ tôi đang thiếu điểm của bạn (rất có thể là trường hợp).Nếu tôi, bạn có thể giải thích thêm một chút không? Cảm ơn – Teddy13

Các vấn đề liên quan