定时器(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的主要内容,如果未能解决你的问题,请参考以下文章

iOS NSTimer定时器

iOS NSTimer定时器

iOS NSTimer定时器

IOS中定时器NSTimer

iOS中定时器NSTimer使用

页面实现多个定时器(计时器)时选用NSTimer还是GCD