定时器(NSTimer scheduledTimerWithTimeInternval)和蓝牙委托:CBPeripheralDelegate 不适用于 NSTimer
Posted
技术标签:
【中文标题】定时器(NSTimer scheduledTimerWithTimeInternval)和蓝牙委托:CBPeripheralDelegate 不适用于 NSTimer【英文标题】:Timer (NSTimer scheduledTimerWithTimeInternval) and Bluetooth Delegate: CBPeripheralDelegate does not work with NSTimer 【发布时间】:2013-09-04 01:08:01 【问题描述】:我需要创建一个常规计时器来读取蓝牙外设的 RSSI 值。我的代码有一个 ViewController 是一个对象的委托,而该对象又是蓝牙的委托:
在我的视图控制器中:
@property (weak, nonatomic) ioeBLE *bleControllerOfDiscoveredGateway;
在 ioeBLE 类 (ioeBLE.h) 中:
@protocol ioeBLEDelegate <NSObject>
@optional
-(void) responseFromBLEController:(NSString *)sw;
@required
@end
@interface ioeBLE : NSObject <CBCentralManagerDelegate, CBPeripheralDelegate>
@property (nonatomic,assign) id <ioeBLEDelegate> delegate;
@property (strong, nonatomic) NSMutableArray *peripherals;
@property (strong, nonatomic) CBCentralManager *CM;
@property (strong, nonatomic) CBPeripheral *activePeripheral;
@end
在 ioeBLE.m 中实现了 CBPeripheralDelegate 的委托方法之一:
- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error
// Code Here
在我的 ViewController - 我正在尝试创建一个常规计时器来使用计时器选择器读取 RSSI 值,这里是计时器创建的代码:
// Schedules a new timer, adds it to the current run loop and waits forever.
- (void) startTimer
_timer = [NSTimer scheduledTimerWithTimeInterval: 10.0
target:self
selector:@selector(request)
userInfo:nil
repeats:YES];
// [[NSRunLoop mainRunLoop] addTimer:_timer forMode:NSDefaultRunLoopMode];
[[NSRunLoop currentRunLoop] addTimer:_timer forMode:NSDefaultRunLoopMode];
// [[NSRunLoop mainRunLoop] runUntilDate:[NSDate distantFuture]];
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate distantFuture]];
我在 viewDidAppear 中调用了 Timer:
[self startTimer]
我遇到的问题很简单——当我如上所述设置计时器时,didUpdateValueForCharacterstic
不会被调用/调用。我注释掉上面的计时器,它开始工作。我已经确认数据到达连接到 iPhone 的 activePeripheral,并且连接是活动的,但是从 Peripheral 返回的响应永远不会返回,因为没有调用委托方法。
【问题讨论】:
【参考方案1】:找到了修复。好吧,我的错 - 我不应该调用 [self startTimer],我需要这个:
- (void) start
@autoreleasepool
[NSThread detachNewThreadSelector:@selector(startTimer)
toTarget:self
withObject:nil];
然后在 viewDidAppear 中:
[self start]
【讨论】:
以上是关于定时器(NSTimer scheduledTimerWithTimeInternval)和蓝牙委托:CBPeripheralDelegate 不适用于 NSTimer的主要内容,如果未能解决你的问题,请参考以下文章