проблема с NSInputStream на реальном iPhone - PullRequest
4 голосов
/ 21 января 2010

У меня проблема с NSInputStream. Вот мой код:

case NSStreamEventHasBytesAvailable:

        printf("BYTE AVAILABLE\n");

        int len = 0;
        NSMutableData *data = [[NSMutableData alloc] init];

        uint8_t buffer[32768];

        if(stream == iStream)
        {       
            printf("Receiving...\n");                       

            len = [iStream read:buffer maxLength:32768];                

            [data appendBytes:buffer length:len];                   

        } 
        [iStream close];

Я стараюсь читать небольшие данные, и они отлично работают на симуляторе и реальном iPhone. Если я попытаюсь прочитать большие данные (более 4 КБ или, может быть, 5 КБ), настоящий iPhone сможет прочитать 2736 байт и остановиться.

Почему это? Помоги мне, плз! Merci d'avance!

Ответы [ 2 ]

2 голосов
/ 24 апреля 2010

Ваш объект данных должен быть внешним по отношению к вашему обработчику потока. Часто бывает так, что когда поступает большое количество данных, вы получаете их порциями, а не сразу. Просто продолжайте добавлять к нему данные, пока не получите bytesRead == 0; Затем вы можете закрыть свой поток и использовать данные.

   case NSStreamEventHasBytesAvailable: {
        NSInteger       bytesRead;
        uint8_t         buffer[32768];

        // Pull some data off the network.

        bytesRead = [self._networkStream read:buffer maxLength:sizeof(buffer)];

        if (bytesRead == -1) {
            [self _stopReceiveWithFailure];
        } else if (bytesRead == 0) {
            [self _stopReceiveWithSuccess];
        } else {
            [data appendBytes:buffer length:len];                   
        }
0 голосов
/ 17 апреля 2010

Похоже, вы создаете новый data объект каждый раз ... возможно, вам следует создать и сохранить его как свойство и добавить к нему, как вы выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...