首次发送后,使用'CBPeripheralManager'发送多个NSData实例失败

Lor*_*Ang 2 xcode bluetooth objective-c ios xcode6

所以我设置了这个代码:

for (int index = 0; index < [dataArray count]; index++) {
    dataToSend = [dataArray objectAtIndex:index];

    BOOL sent = [self.manager updateValue:dataToSend
                      forCharacteristic:(CBMutableCharacteristic *)self.cashierCarachteristic
                   onSubscribedCentrals:nil];

    if (!sent) {
        NSLog(@"Failed to send :(");
    }
}
Run Code Online (Sandbox Code Playgroud)

然而,我的问题在于,在发送来自阵列的第一段NSData之后,所有后续发送都失败了.我总是得到这个:

2014-10-24 17:01:45.162 Pengoo [1957:60b]发送数据:94

2014-10-24 17:01:45.164 Pengoo [1957:60b]发送数据:94

2014-10-24 17:01:45.166 Pengoo [1957:60b]发送失败:(

2014-10-24 17:01:45.167 Pengoo [1957:60b]发送数据:94

2014-10-24 17:01:45.168 Pengoo [1957:60b]发送失败:(

2014-10-24 17:01:45.169 Pengoo [1957:60b]发送数据:94

2014-10-24 17:01:45.170 Pengoo [1957:60b]发送失败:(

谁能告诉我为什么会这样?我是否可能将我的经理设置错误,或者这是CBPeripheralManager或... 的限制?

在此先感谢大家:)

Pau*_*w11 6

请参阅CBPeripheralManager文档 -

讨论 您可以使用此方法通过通知或指示将特征值的更新发送到已订阅该特征值的选定中心.

如果该方法返回NO因为底层传输队列已满,外围管理器调用peripheralManagerIsReadyToUpdateSubscribers:其委托对象的方法时在发送队列中更多的空间变得可用.调用此委托方法后,您可以重新发送更新.

基本上蓝牙硬件以有限速率发送和具有有限的输入缓冲器,并与该装置的执行速度两者都是相对较小 - 因此,能够为应用程序快速地产生更多的数据比硬件可以处理.

updateValue返回NO,你需要排队你发送请求,然后重新启动传输,直到后peripheralManagerIsReadyToUpdateSubscribers:委托方法被调用.然后,您可以恢复传输,直到它再次返回false