У кого-нибудь есть пример того, как обрабатывать события чтения и записи NSStream в Monotouch при работе с аксессуарами через EASession?
Похоже, что для этого нет строго типизированного делегата, и у меня возникают проблемы с выяснением того, какие селекторы мне нужно обработать для делегатов моего InputStream и OutputStream, и что мне действительно нужно делать с каждымселектор для правильного заполнения и опустошения буферов, принадлежащих объекту EASession.
По сути, я сейчас пытаюсь перенести приложение Apple EADemo на Monotouch.
Вот источник Objective-C, который, я думаю, имеет отношение к этой проблеме:
/
/ asynchronous NSStream handleEvent method
- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode
{
switch (eventCode) {
case NSStreamEventNone:
break;
case NSStreamEventOpenCompleted:
break;
case NSStreamEventHasBytesAvailable:
[self _readData];
break;
case NSStreamEventHasSpaceAvailable:
[self _writeData];
break;
case NSStreamEventErrorOccurred:
break;
case NSStreamEventEndEncountered:
break;
default:
break;
}
}
/ low level write method - write data to the accessory while there is space available and data to write
- (void)_writeData {
while (([[_session outputStream] hasSpaceAvailable]) && ([_writeData length] > 0))
{
NSInteger bytesWritten = [[_session outputStream] write:[_writeData bytes] maxLength:[_writeData length]];
if (bytesWritten == -1)
{
NSLog(@"write error");
break;
}
else if (bytesWritten > 0)
{
[_writeData replaceBytesInRange:NSMakeRange(0, bytesWritten) withBytes:NULL length:0];
}
}
}
// low level read method - read data while there is data and space available in the input buffer
- (void)_readData {
#define EAD_INPUT_BUFFER_SIZE 128
uint8_t buf[EAD_INPUT_BUFFER_SIZE];
while ([[_session inputStream] hasBytesAvailable])
{
NSInteger bytesRead = [[_session inputStream] read:buf maxLength:EAD_INPUT_BUFFER_SIZE];
if (_readData == nil) {
_readData = [[NSMutableData alloc] init];
}
[_readData appendBytes:(void *)buf length:bytesRead];
//NSLog(@"read %d bytes from input stream", bytesRead);
}
[[NSNotificationCenter defaultCenter] postNotificationName:EADSessionDataReceivedNotification object:self userInfo:nil];
}
Буду также признателен за любые архитектурные рекомендации о том, как наилучшим образом реализовать это в Monotouch.Например, в реализации Objective C эти функции не содержатся ни в одном классе - но в Monotouch имело бы смысл сделать их членами моего