Прямо сейчас я работаю над программой, использующей 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;
}