Я загружаю файл и записываю его байты в NSOutputStream
:
self.outputFileStream = [NSOutputStream outputStreamToFileAtPath:downloadFilePath
append:NO];
[self.outputFileStream setDelegate:self];
Затем в didReceiveResponse
обратном вызове NSURLSession
:
[self.outputFileStream open];
И после получения первых байтов:
const uint8_t *bytes = (const uint8_t*)[data bytes];
NSInteger bytesLeft = [data length];
NSInteger bytesWritten = -1;
do {
bytesWritten = [self.outputFileStream write:bytes maxLength:bytesLeft];
if (bytesWritten == -1) {
break;
}
bytesLeft -= bytesWritten;
} while (bytesLeft > 0);
Выполнение останавливается при первой попытке записи данных в поток: write:maxLength:
возвращает -1.
Чтобы выяснить, почему это происходит, я реализовал метод делегата handleEvent: eventCode:
.
По какой-то причине он вызывается, только если при инициализации потока я помещаю следующие строки кода:
[self.outputFileStream scheduleInRunLoop:[NSRunLoop mainRunLoop]
forMode:NSDefaultRunLoopMode];
и возвращает NSStreamEventErrorOccurred
с описанием No such file or directory
, хотя каталог дважды проверяется на наличие.