Почему NSData ломает мое приложение? - PullRequest
0 голосов
/ 20 декабря 2011

У меня есть URL, который является ссылкой на аудиофайл и будет воспроизводиться с использованием AVFoundation.framework.Но по какой-то причине, когда приложение достигает настройки NSData, оно падает.Пожалуйста, помогите.

NSURL *url = [NSURL URLWithString:songPathForm];
NSData *soundData = [NSData dataWithContentsOfURL:url];

РЕДАКТИРОВАТЬ :::: Это то, что я сделал, чтобы остановить сбой, но данные ничего не содержат

 NSString *url = [songPathForm stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];


                    //NSURL *url = [NSURL URLWithString:songPathForm];
                    NSURLRequest *songRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:url]
                                                              cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60.0];

                NSURLConnection *songConnection = [[NSURLConnection alloc] initWithRequest:songRequest delegate:self];

                if(songConnection)
                {
                    songData = [[NSMutableData data] retain];
                }

Это выглядит как <>

1 Ответ

4 голосов
/ 20 декабря 2011

Нет абсолютно никакого способа ответить на этот вопрос, поскольку он сформулирован, но вот некоторые подсказки:

  • , если есть сбой, есть обратный след.Опубликуйте его.

  • Если произошел сбой, возникла какая-то ошибка.Отправьте его.

Учитывая этот код, я могу придумать два режима отказа:

  • songPathForm - это nil илиповрежден и / или не является URL.

  • данные в URL слишком велики для загрузки и заставляют приложение пытаться выделить ОГРОМНЫЙ объем памяти (в некоторых случаяхвыделение может быть достаточно большим, чтобы вызвать сбой приложения без запуска механизма jetsam системы.

Нет сообщения об ошибке, оно просто зависает и перестает отвечать.url не ноль, это ...

Тогда почему вы сказали, что ваше приложение упало?!

dataWithContentsOfURL: синхронно загружает содержимое того, что находится по URL.

Таким образом, вы блокируете основной цикл событий во время загрузки, и поэтому ваше приложение не отвечает.

Вам необходимо асинхронно загрузить данные;т.е. не блокировать основной цикл событий.

Однако это, вероятно, не решит полностью вашу проблему, так как выглядит, что содержимое этого URL действительно велико и, таким образом, вы, вероятно, собираетесьисчерпать память, если вы пытаетесь загрузить в память.

Вам нужно либо загрузить файл на диск, либо вам нужно загрузить только те его части, которые вам нужны прямо сейчас, или вам необходимо выполнить потоковую передачу (если это действительно большой аудиофайл, как следует из URL).

Код в вашем обновленном вопросе не имеет никакого смысла.Как вы ожидаете, что songData будет заполнено данными из соединения?

Когда вы делаете что-то асинхронно, вы в основном говорите: «Иди, сделай это, и дай мне знать время от времени, как оно происходит».В этом случае это будет уведомление о том, что доступно больше данных или что соединение установлено на чтение (или по ошибке).

Вы не можете запросить данные сразу, потому что данные не сразудоступно.

Вам нужно прочитать это руководство .

...