【发布时间】:2018-03-29 13:55:27
【问题描述】:
我尝试同步使用蓝牙通信。我将数据发送到 BTLE 设备并等待响应以相同的方法继续,除非发生超时。
我想使用 NSRUNLOOP 等待。但是,我有一个问题,只有当循环完成时,才能处理其间接收到的数据。所以循环似乎阻止了数据的处理。
数据在单独的线程中发送
... create command data
if (![self sendCommand:nd_commandData timeOutMesc:ui_timeOutMSec command:ui_command error:error])
{
// Timeout
return false;
}
... continue working with the received data
超时发送方法:
-(BOOL)sendCommand:(NSData *)nd_sendData timeOutMesc:(uint)ui_timeOutMSec command:(UInt16)ui_command
{
b_exitConditionSleep = false;
b_timeOutOccurred = false;
self.ni_totalResponseLength = 0;
self.ni_expectedResponseLength = 0;
// Clear buffer
memset(&uia_receivedDataBytes[0], 0x00, sizeof(uia_receivedDataBytes));
[[BTLE_Communicator sharedInstance] setDelegate:self];
// send data
[[BTLE_Communicator sharedInstance] sendDataFromAppToBLEDevice:nd_sendData];
BOOL b_rechTimeOut = true;
NSDate *start = [NSDate date];
NSTimeInterval timeInterval;
uint ui_differenz;
NSDate *loopUntil = [NSDate dateWithTimeIntervalSinceNow:0.01];
while (!b_exitConditionSleep && [[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate:loopUntil])
{
loopUntil = [NSDate dateWithTimeIntervalSinceNow:0.01];
timeInterval = [start timeIntervalSinceNow] * -1;
ui_differenz = round(timeInterval * 1000);
if (ui_differenz >= ui_timeOutMSec) {
NSLog(@"Command: 0x%hX - Timeout reached: %u", ui_command, ui_differenz);
b_rechTimeOut = false;
b_timeOutOccurred = true;
break;
}
}
return b_rechTimeOut;
}
接收方式:
-(void)communicatorPeripheralDidReceiveResponseUARTData:(NSData *)nd_data
{
NSLog(@"ResponseUARTData %@", nd_data);
if (!b_timeOutOccurred)
{
b_exitConditionSleep = true;
[self processResponseData:nd_data];
}
}
也许有人指出我做错了什么。
【问题讨论】:
-
您正试图将一个固有的异步进程转变为一个同步进程。这很少是一个好主意。
标签: ios objective-c core-bluetooth nsrunloop