cocoa - IO蓝牙同步读取

标签 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;
}

最佳答案

以同步方式进行任何类型的 IO/通信都会给您带来麻烦。

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

关于cocoa - IO蓝牙同步读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5126175/

相关文章:

cocoa - 当堆栈 View 大小调整时,如何使 NSButton 与 NSStackView 分离?

python - 运行 python3 Xcode 项目时出错(符号链接(symbolic link)级别过多,不允许操作)- macOS BigSur

objective-c - 揭秘 NSOperation : concurrent vs non-concurrent and async pattern

objective-c - Cocoa API 的 C 绑定(bind)?

macos - 在没有任何窗口的情况下保持 NSDocument 打开

macos - 用于在登录时为用户创建文件夹并设置访问权限的 bash 脚本

macos - OS-X 中的 MonoDevelop,尝试创建一个包含多个项目的解决方案

javascript - 如何让 JavaScript 回调等待另一个回调?

javascript - 下面的代码是异步的吗?

ios - 函数可以从异步 block 返回值吗