如何在 Objective C 中创建事件循环?
How to create an event loop in Objective C?
我正在尝试使用 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 应用程序,所以我可能遗漏了显而易见的东西。如果我不得不猜测我做错了什么,我会假设:
- I actually have to wait for the
CentralManager
to be in the appropriate state before starting the scan.
- 我从来没有真正进入状态更改委托方法,所以我假设我的第一个错误是: 我必须 运行 一个事件而不是 某种循环,以便底层系统有机会通知我状态更改。
我基本上被困在了这一点上:我没有 GUI,也不想要,但无法找到 运行 事件循环的方法(假设这实际上是什么丢失的)。我该怎么做?
正如我所说,这实际上是我第一次尝试 Objective C,所以不要害怕说出显而易见的事情。
简单地运行线程的运行循环
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:5]];
更多信息here。
顺便说一句:您不必声明已在协议中声明的方法。
我正在尝试使用 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 应用程序,所以我可能遗漏了显而易见的东西。如果我不得不猜测我做错了什么,我会假设:
- I actually have to wait for the
CentralManager
to be in the appropriate state before starting the scan. - 我从来没有真正进入状态更改委托方法,所以我假设我的第一个错误是: 我必须 运行 一个事件而不是 某种循环,以便底层系统有机会通知我状态更改。
我基本上被困在了这一点上:我没有 GUI,也不想要,但无法找到 运行 事件循环的方法(假设这实际上是什么丢失的)。我该怎么做?
正如我所说,这实际上是我第一次尝试 Objective C,所以不要害怕说出显而易见的事情。
简单地运行线程的运行循环
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:5]];
更多信息here。
顺便说一句:您不必声明已在协议中声明的方法。