我正在试图弄清楚如何触发某些回调。
在外设peripheralManager:central:didSubscribeToCharacteristic:
上被正确调用,它将一个数据块(第一个中的两个)发送到中心,并按预期在peripheral:didUpdateValueForCharacteristic:error:
中接收它。
现在剩下一个块应该根据Apple's test application在外围设备的回调peripheralManagerIsReadyToUpdateSubscribers:
中发送。
我已经过测试和验证,并且在那里工作正常。这有点可疑但是根据文档它只应该在外围管理器的updateValue:forCharacteristic:onSubscribedCentrals:
失败时被调用。
如何让外围设备发送剩余的块?我可以为您提供代码,但它几乎完全相同(我使用的是NSData数据块而不是一个大的NSData,例如示例)对于我链接到的示例应用程序,我更好奇的是回调链如何工作以及需要为不同的选择器触发的内容。
答案 0 :(得分:3)
我设法通过使用peripheralManagerIsReadyToUpdateSubscribers:
中的循环(从sendData
和peripheralManagerIsReadyToUpdateSubscribers:
调用)来触发peripheralManager:central:didSubscribeToCharacteristic:
。
- (void)sendData {
BOOL success = YES;
while (success && ([_outgoingDataQueue count] > 0)) {
NSData *chunk = [_outgoingDataQueue peek];
success = [self.peripheralManager updateValue:chunk
forCharacteristic:self.characteristic
onSubscribedCentrals:nil];
if (success) {
[_outgoingDataQueue dequeue];
}
}
}
这不是将数据作为块发送到中心的正确方法。
答案 1 :(得分:3)
您正在做的是正常的操作方式。外围设备管理器处理数据发送并根据当前设置实现流量控制。例如。如果您使用指示而不是通知,则每次更新都必须由接收方确认,然后才能再次发送。
另一方面,通知与UDP数据包类似。他们可能迷路了。为了确保数据无错误地到达,您需要实现额外的控制流管理。
总而言之,你做得对。