我有一个众所周知的(由我)串行外设构建的BLE外设。 对于该串行外设,我有一个完整的家庭女佣,实现其串行协议。 该协议遵循以下规则:发送消息然后立即收到答案。
右。我已经通过蓝牙重新实现了通信,使用CoreBluetooth.framework,它的工作并没有那么糟糕。 我的主要问题是等到调用didUpdateValueForCharacteristic之后再考虑获得回复。 (谢谢stackoverflow的家伙们,我发现这里的回复数量已经挽救了我的生命)
但现在在与我的设备交谈时,我必须做一些事情:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
dispatch_async(m_ProcessingQueue, ^{
bool ok = [MyPeripheral ExcecuteCommand];
});
}
如果我这样做:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
bool ok = [MyPeripheral ExcecuteCommand];
}
未调用didUpdateValueForCharacteristic。执行命令超时,并返回false。然后,调用didUpdateValueForCharacteristic,其中包含良好的数据。
我已经发现在主线程中调用了didUpdateValueForCharacteristic:
- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error
{
NSLog(@"didUpdateValueForCharacteristic %@", [NSThread isMainThread]?@"is main thread":@"is NOT main thread"); // wich reply true !
}
所以如果没有调用[MyPeripheral ExcecuteCommand];在另一个线程中,我得到主线程被阻止,并且永远不要让didUpdateValueForCharacteristic被调用。
最后我的问题是: 有没有办法在后台线程中调用didUpdateValueForCharacteristic?
谢谢!