Получаване на байтови данни от файл

КАКВО ПРАВЯ Опитвам се да получа аудио файл (може да е дълъг до един час, напр. подкаст), който съм записал с AVAudioRecorder, за да бъде качен в нашия бекенд. В допълнение към качването на сървъра, то трябва да може да бъде „Поставено на пауза“ и „Възобновено“, ако потребителят избере. Поради това вярвам, че трябва да използвам dataWithBytesNoCopy:buffer в класа NSData, за да постигна това.

КЪДЕ СЪМ Със сигурност знам, че мога да получа данните с помощта на предаденото свойство self.mediaURL:

if (self.mediaURL) {

    NSData *audioData = [NSData dataWithContentsOfURL:self.mediaURL];

    if (audioData) {

        [payloadDic setObject:audioData forKey:@"audioData"];
    }

}

Това обаче няма да ми даде желаната функционалност. Опитвам се да следя качените байтове, за да мога да възобновя, ако потребителят спре.

ВЪПРОС Как мога да използвам предоставения self.mediaURL, за да мога да извлека файла и да мога да изчисля дължината на байта като този пример?

Byte *buffer = (Byte*)malloc((long)audioFile.size);
NSUInteger buffered =[rep getBytes:buffer fromOffset:0.0 length:(long)rep.size error:nil];

NSMutableData *body = [[NSMutableData alloc] init];
body = [NSMutableData dataWithBytesNoCopy:buffer length:buffered freeWhenDone:YES];

person Brandon A    schedule 13.10.2015    source източник


Отговори (1)


Вместо да правите нещата по-сложни за себе си, опитвайки се да преоткриете колелото, използвайте това, което системата ви дава. NSURLSession ви позволява да извършвате качване във фонов режим . Предавате задачата на сесията (създадена с помощта на конфигурацията на фоновата сесия) и просто си тръгвате. Качването става на части, когато може. Не е необходима "пауза" или "възобновяване"; системата се грижи за всичко. Вашето приложение дори не трябва да работи. Ако е необходимо удостоверяване, вашето приложение ще се събуди във фонов режим, както е необходимо. Тази архитектура е просто създадена за ситуацията, която описвате.

Ако проблемът е, че искате произволен достъп до файлови данни, без да се налага да четете всичко в масивен NSData, използвайте NSFileHandle.

person matt    schedule 13.10.2015
comment
Благодаря за отговора. Но нашият екип изрично иска бутон за пауза, за да спре качването, и бутон за възобновяване, за да започне качването отново от мястото, където файлът е прекъснат. Така че нашият API ще бъде проектиран да ни изпраща обратно заглавка, след като потребителят щракне върху Възобновяване, която ще съдържа последния байт, на който е спряло качването, тогава ще трябва да взема тази информация и да я включа в метода dataWithBytesNoCopy:buffer, за да започна качването отново от правилната позиция в данните. - person Brandon A; 13.10.2015
comment
Е, задачата за качване не може да бъде възобновена, така че в крайна сметка ще свършите цялата работа сами... - person matt; 13.10.2015
comment
Добавено е споменаване на NSFileHandle към моя отговор; това може да е това, което търсите. - person matt; 13.10.2015
comment
Благодаря Мат. Ще го разгледам след време и ще ви кажа дали работи или не. - person Brandon A; 14.10.2015
comment
Е, измина повече от година от тази публикация. Вярвам, че сме премахнали цялата функция за автобиография заедно. Но за това, че сте страхотни, получавате отметка. - person Brandon A; 25.01.2017