2012-04-12 8 views
0

Я разрабатываю приложение для iPhone, которое последовательно воспроизводит 3 файла, используя класс AVQueuePlayer.Выбор дизайна с помощью AVQueuePlayer и hpple

3 URL-адреса, которые мне нужно воспроизвести последовательно, должны быть извлечены сначала из .htm-файла, используя протокол http: //. Для этого я использую класс TFHpple, отсюда hpple git project

Моя проблема заключается в том, что мой проигрыватель AVQueuePlayer должен работать в основном потоке, а когда я пытаюсь разобрать файл .htm, экран не отвечает ни на какие трогают.

Сначала мне нужны URL-адреса, которые содержатся в этих .htm-файлах, которые нужно разобрать, а затем передать URL-адрес проигрывателю AVQueuePlayer.

Я читал документацию Apple, в которой говорится, что многопоточность является плохим выбором для сетевых приложений, но мне нужно использовать hpple для анализа содержимого .htm.

Как решить эту проблему?

+0

Почему бы не разобрать HTML на другой поток? Фактическая сеть/загрузка моего все еще происходит на mainThread, если это действительно необходимо. – Till

+0

Кроме того, рассмотрите возможность использования [RaptureXML] (https://github.com/ZaBlanc/RaptureXML) для синтаксического анализа - это очень быстро! – Till

+0

Если я анализирую HTML на другом потоке, то плеер не будет в основном потоке. Как это сделать? Я проверю RaptureXML. Благодаря! – Winston

ответ

1

При использовании AVQueuePlayer в основной теме, но вызванной из другого потока, это единственная проблема, просто завершите его запуск с помощью метода, который вызывается из другого потока, используя performSelectorOnMainThread.


От NSObject reference;

- (void)performSelectorOnMainThread:(SEL)aSelector 
         withObject:(id)arg 
         waitUntilDone:(BOOL)wait 

Вызывает метод приемника по основному потоку с использованием режима по умолчанию.

Обсуждение

Вы можете использовать этот метод для доставки сообщений в основном потоке приложения. Основной поток включает основной цикл запуска приложения и где объект NSApplication принимает события. Сообщение в этом случае представляет собой метод текущего объекта, который вы хотите выполнить в потоке.

Этот метод ставит в очередь сообщение в цикле выполнения основного потока, используя общие режимы цикла запуска, то есть режимы, связанные с константой NSRunLoopCommonModes. Как часть обычной обработки цикла цикла, основной поток деактивирует сообщение (при условии, что он работает в одном из общих режимов цикла запуска) и вызывает желаемый метод. Несколько вызовов этого метода из одного и того же потока приводят к тому, что соответствующие селектора должны быть поставлены в очередь и выполняться в том же порядке, в котором выполнялись вызовы.

Вы не можете отменять сообщения, поставленные в очередь с использованием этого метода. Если вам нужна опция отмены сообщения в текущем потоке, вы должны использовать либо performSelector: withObject: afterDelay: или выполнитьSelector: withObject: afterDelay: inModes: method.


Кроме того, я бы рекомендовал смотреть в RaptureXML для синтаксического анализа, как это одной рубрике постное, быстро и удобно.

+0

Большое спасибо! – Winston