Добавить байты в NSInputStream для последующего последовательного чтения

Я последовательно получаю куски NSData с сервера, более чем прибл. 4096 байт за раз, последовательно. Каждый полученный фрагмент может отличаться по размеру.

Что я хотел бы сделать, так это добавить куда-нибудь все эти байты и в то же время начать чтение с начала данных, последовательно, 512 байт за раз максимум.

Во время поиска я узнал об использовании NSInputStream для этого, и вот фрагмент кода:

        uint8_t bytes[512];
        UInt32 length;

        NSInputStream *stream = [[NSInputStream alloc] initWithData:aData];
        [stream open];
        while (((length = [stream read:bytes maxLength:512]) > 0)) {
            if ([self.inputStreamer isKindOfClass:[PLAudioInputStreamerNoOpenClose class]]) {
                [self.inputStreamer hasData:bytes length:length];
            }
        }

Хотя это просто работает, кажется, что инициализированный NSInputStream не позволяет добавлять дополнительные байты после его инициализации, поэтому единственный способ, который я мог придумать, - это инициализировать NSInputStreams для каждого фрагмента данных и блокировать до тех пор, пока он не достигнет своего конца, переходя on, чтобы сделать то же самое для следующего фрагмента байтов, как это делает приведенный выше код.

Есть ли более предпочтительное решение для такого рода задач? Любая помощь будет оценена. Спасибо,


person Sunwoo Park    schedule 16.05.2014    source источник
comment
Если вы говорите на корейском языке, следуйте предложению «Переполнение стека на корейском языке». area51.stackexchange.com/proposals/68765/   -  person 9dan    schedule 16.05.2014


Ответы (1)


Вам нужен поток «чтения и записи». NSInputStream только для чтения, а NSOutputStream только для записи.

На вашем месте я просто использую NSMutableData и одну переменную int для «текущей позиции чтения».

NSMutableData* myData = [[NSMutableData alloc] init];
NSInteger myPos = 0;

[myData appendData:..];
...
// need to check the range (myPos ~ [myData length])
NSData* nextBlockToRead = [NSData dataWithBytesNoCopy:((char*)[myData bytes] + myPos) length:512];
myPos += 512;
person 9dan    schedule 16.05.2014
comment
Вам нужен поток «чтения и записи» — как получить поток «чтения и записи»? у меня та же проблема, что и у OP (мне нужен поток, а не NSMutableData) - person Peter Lapisu; 03.02.2015
comment
@PeterLapisu Не NSMutableData, может NSFileHandle? Существует множество способов ввода/вывода файлов, developer.apple.com/library/mac/documentation/FileManagement/ - person 9dan; 04.02.2015