IOBluetooth同步读取

时间:2011-02-26 09:45:15

标签: cocoa macos asynchronous synchronization iobluetooth

现在我正在使用IOBluetooth开发一个程序,我需要进行同步读取,即我调用一个方法,它将给定数量的字节写入端口,然后读取给定的数字并返回它们。我目前有一个复杂的NSThreads,NSLocks和NSConditions系统,虽然它有点工作,但速度很慢。此外,在某些调用之后,我需要确保没有额外的数据,所以我通常会刷新缓冲区,但是IOBluetooth的异步回调是不可能的 - 任何想法如何确保无论如何,所有数据都收到后特定点是在该点之后收到的数据吗?

我真的没有处理过这种类型的同步和多线程,因为到目前为止我所做的所有工作都是使用同步调用,所以我对这件事情有任何想法。

这是传入数据的回调(“incomingData”对象是NSMutableData):

- (void)rfcommChannelData:(IOBluetoothRFCOMMChannel*)rfcommChannel data:(void *)dataPointer length:(size_t)dataLength {
    [dataLock lock];
    NSData *data = [NSData dataWithBytes:dataPointer length:dataLength];
    [incomingData appendData:data];

    if (dataWaitCondition && [incomingData length] >= bytesToWaitFor) {
        [dataWaitCondition signal];
    }

    [dataLock unlock];
    [delegate bluetoothDataReceived];
}

这是在返回数据对象之前等待直到给定给定字节数的方法(这是从备用线程调用的)。

- (NSData *)waitForBytes:(int)numberOfBytes {

    bytesToWaitFor = numberOfBytes;
    [dataLock lock];
    dataWaitCondition = [[NSCondition alloc] init];
    [dataWaitCondition lock];
    [dataLock unlock];
    while ([incomingData length] < numberOfBytes) {
        [dataWaitCondition wait];
    }
    [dataLock lock];
    NSData *data = [incomingData copy];
    [dataWaitCondition unlock];
    dataWaitCondition = NULL;
    [dataLock unlock];

    return data;
}

1 个答案:

答案 0 :(得分:0)

以同步方式进行任何类型的IO /通信都会让您遇到麻烦。

通过为应用程序逻辑使用简单的状态机,可以避免多线程和锁定。无论何时收到数据,都会触发状态机并处理数据。如果所有数据都存在,您可以在应用中执行下一步。如果您愿意,可以使用同步调用进行发送,因为它只会丢弃蓝牙系统的数据。