обработка событий NSStream при использовании EASession в MonoTouch - PullRequest
0 голосов
/ 22 декабря 2010

У кого-нибудь есть пример того, как обрабатывать события чтения и записи 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 имело бы смысл сделать их членами моего

1 Ответ

0 голосов
/ 02 января 2011

Похоже, что последняя версия MonoTouch (мне пришлось сначала обновить ее до iOS 4.2, чтобы получить ее) теперь реализует строго типизированный делегат для HandleEvent и новый тип NSStreamEvent, так что его легче обрабатывать:

// asynchronous NSStream handleEvent method
public override void HandleEvent (NSStream theStream, NSStreamEvent streamEvent)
{
    switch (streamEvent) 
    {
        case NSStreamEvent.None:
            break;
        case NSStreamEvent.OpenCompleted:
            break;
        case NSStreamEvent.HasBytesAvailable:
            LowReadData((NSInputStream)theStream);
            break;
        case NSStreamEvent.HasSpaceAvailable:
            LowWriteData((NSOutputStream)theStream);
            break;
        case NSStreamEvent.ErrorOccurred:
            break;
        case NSStreamEvent.EndEncountered:
            break;
        default:
            break;
    }
}   
...