1

connectPeripheral 方法在具有 CBCentralManagerDelegate 的类中定义。I need to call connectPeripheral from the table view controller when didSelectRowAtIndexPath is selected. 连接外围设备后,它应该继续执行视图控制器中剩余的代码行。我能够连接到外围设备。但在连接完成之前,它会执行代码的剩余部分。由于外围设备尚未连接,因此它没有完成必要的工作。

我使用 dispatch_sync 来确保建立连接,然后执行剩余的代码,但它不起作用。我怎样才能解决这个问题?我对IOS编程比较陌生。任何输入都受到高度赞赏。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    CBPeripheral    *peripheral = nil;
    NSArray         *devices = [[NSArray alloc] init];

    switch (indexPath.section) {
            case 0: {
                devices = [[BTLECentralManager sharedInstance] foundPeripherals];
                peripheral = (CBPeripheral *)[devices objectAtIndex:indexPath.row];
                    dispatch_sync(syncConnection, ^{
                        [[BTLECentralManager sharedInstance] connectPeripheral:peripheral];
                        activePeripheral = [self serviceForPeripheral:peripheral];
                        NSLog(@"Active Peripheral %@",activePeripheral);
                        [activePeripheral getTimeDate];
                    });

                break;
                }
            default:
            break;
        }
}
4

1 回答 1

0

与外围设备连接的请求是一个异步过程。您不能将其包装在 adispatch_sync中以使其同步。(无论如何,你不想让它同步。)

的同步分派connectPeripheral只是同步分派连接到该外围设备的请求,但不会改变连接过程本身的固有异步性质。实际上,您通常不希望将这些异步请求分派到您自己的后台队列中。Apple 提供了一个不错的异步接口,因此您可以从主线程继续使用它。

虽然理论上您可以为此连接过程创建一个同步接口,但您不应该这样做。相反,您应该接受接口的异步特性。要么实现委托,要么可能将委托包装CBCentralManager在一些提供基于块的接口的对象中。

于 2014-08-25T21:20:01.263 回答