Pull to refresh

Comments 11

А это не мог быть такой NSURLProtocol, чтобы для всего остального приложения это кеширование осталось прозрачным?

Я не думаю, что AVPlayer грузит данные через [NSURLSession defaultSession]. А в этом случае запросы в протокол приходить не будут, пока его не добавили в protocolClasses у сессии.

Зарегистрированные стандартным образом кастомные протоколы вроде как раз в любых конфигурациях NSURLSession работают. protocolClasses как раз для локального расширения отдельной конфигурации.


Но AVPlayer вроде и правда к NSURLProtocol не привязать, хотя бы потому что логика загрузки там нужна более специфичная и сложная, что и видно в API.

В хедере NSURLSession:


You should not use +[NSURLProtocol registerClass:], as that
   method will register your class with the default session rather
   than with an instance of NSURLSession. 
Только передо мной встала подобная задача, и вот её решение. :) Спасибо, попробую воспользоваться, и надеюсь не забыть отписаться потом тут. У нас AVURLAsset создаётся из m3u, кажется, куда запрятан ts-поток.

> Для этого достаточно поменять схему URL у AVURLAsset'а с HTTP(S) на любую другую. Не забудьте сохранить оригинальную, она вам ещё понадобится.
Я на плейлистах не тестировал. Если будут проблемы, открывайте issue на гитхабе, будем смотреть.
Отправил не дописав…

> Для этого достаточно поменять схему URL у AVURLAsset'а с HTTP(S) на любую другую. Не забудьте сохранить оригинальную, она вам ещё понадобится.
Я не понял почему в DVURLAsset в init не сохраняется схема внутри, а просто затирается. Хотя я пока ещё не разобрался как пользоваться этой библиотечкой, но кажется там чего-то всё же не хватает. Мне не совсем понятно где кеширование происходит? Зачем у делегата делегат? Подход ясен, но исходники покурю ещё. Ещё раз спасибо.
> Я не понял почему в DVURLAsset в init не сохраняется схема внутри, а просто затирается.
В конструктор AVURLAsset передаётся изменённая схема для того, чтобы ассет вызывал методы делегата, а не загружал данные своими силами. Оригинальная схема передаётся в DVAssetLoaderDelegate строкой ниже, там и используется.

> Мне не совсем понятно где кеширование происходит?
У DVURLAsset есть делегат. В него приходят данные, которые можно сохранить самостоятельно.

> Зачем у делегата делегат?
Когда ассет не может загрузить данные самостоятельно, он просит это сделать делегата. Как только он (делегат) закончил загрузку, он оповещает об этом свой делегат. Получается делегат делегата :)
Пожалуй, переименую его в observer.
> Оригинальная схема передаётся в DVAssetLoaderDelegate строкой ниже, там и используется.
Вот честно, не вижу такой строки. Возможно просто туплю.

> У DVURLAsset есть делегат. В него приходят данные, которые можно сохранить самостоятельно.
Сохранить да, но переиспользовать?
> Вот честно, не вижу такой строки. Возможно просто туплю.
код
NSURLComponents *components = [[NSURLComponents alloc] initWithURL:URL resolvingAgainstBaseURL:NO];
components.scheme = [DVAssetLoaderDelegate scheme];

if (self = [super initWithURL:[components URL] options:options]) {
DVAssetLoaderDelegate *resourceLoaderDelegate = [[DVAssetLoaderDelegate alloc] initWithURL:URL];

В нижней строке используется оригинальный URL, а не модифицированный.

> Сохранить да, но переиспользовать?
В следующий раз можно создавать AVURLAsset из локального URL.
Спасибо, теперь вижу. :)
А вот с переиспользованием перез ручное управление кешем (через делегат делегата) у меня не получится, из-за m3u как раз. :( Эта задачка у меня откладывается на недельку пока. Если заказчик решит к ней вернуться, то постараюсь не забыть поделиться кодом того что наваяю в итоге.
Sign up to leave a comment.