我正在尝试使用CoreBluetooth
模块在命令行OSX应用程序中列出所有检测到的蓝牙设备。
到目前为止,我看起来像这样:
@import CoreBluetooth;
@interface MyCentralManager : NSObject<CBCentralManagerDelegate>
- (void) centralManagerDidUpdateState: (CBCentralManager *) central;
- (void) centralManager:(CBCentralManager *) central
didDiscoverPeripheral:(CBPeripheral *) peripheral
advertisementData:(NSDictionary *) advertisementData
RSSI:(NSNumber *)RSSI;
@end
@implementation MyCentralManager
- (void) centralManagerDidUpdateState: (CBCentralManager *) central
{
NSLog(@"State changed...");
}
- (void) centralManager:(CBCentralManager *) central
didDiscoverPeripheral:(CBPeripheral *) peripheral
advertisementData:(NSDictionary *) advertisementData
RSSI:(NSNumber *)RSSI
{
NSLog(@"Discovered %@", peripheral.name);
}
@end
int main() {
MyCentralManager* myCentralManager = [[MyCentralManager alloc] init];
CBCentralManager* cbCentralManager = [[CBCentralManager alloc] initWithDelegate:myCentralManager queue:nil options:nil];
NSLog(@"Scanning devices now !");
[cbCentralManager scanForPeripheralsWithServices:nil options:nil];
sleep(5); // Wait 5 seconds before stopping the scan.
[cbCentralManager stopScan];
NSLog(@"Scanning devices ended.");
return 0;
}
现在这根本不起作用,因为我从来没有得到任何"State changed..."
或"Discovered ..."
日志输出。
我之前从未真正写过任何Objective C应用程序,所以我可能错过了显而易见的东西。如果我不得不猜测我做错了什么我会认为:
CentralManager
to be in the appropriate state before starting the scan。sleep()
',我必须运行某种类型的事件循环以便底层系统有机会通知我状态变化。 我基本上停留在这一点:我没有GUI,我也不想要一个但却无法找到运行事件循环的方法(假设实际上缺少了这个)。我怎么能这样做?
正如我所说,这实际上是我对Objective C的第一次尝试,所以不要害怕陈述显而易见的事情。
答案 0 :(得分:2)
只需运行线程的运行循环
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:5]];
更多信息here。
BTW:您不必声明协议中已声明的方法。