Новая Яндекс.Музыка. Особенности разработки ios-клиента...
DESCRIPTION
Осенью 2013 года мы приняли решение переписать iOS-приложение Яндекс.Музыки. Именно так получилась версия 3.0. В докладе небольшой рассказ о том, что «под капотом» нашего приложения, с какими нестандартными проблемами мы столкнулись при разработке и как с ними справлялись.TRANSCRIPT
![Page 1: Новая Яндекс.Музыка. Особенности разработки iOS-клиента — Сергей Зайцев](https://reader034.vdocuments.net/reader034/viewer/2022052522/547b2c96b4af9f7a328b45f5/html5/thumbnails/1.jpg)
![Page 2: Новая Яндекс.Музыка. Особенности разработки iOS-клиента — Сергей Зайцев](https://reader034.vdocuments.net/reader034/viewer/2022052522/547b2c96b4af9f7a328b45f5/html5/thumbnails/2.jpg)
Новая Яндекс.Музыка. Особенности разработки iOS клиента.Зайцев СергейЯ.Субботник, Новосибирск, 18.10.2014
![Page 3: Новая Яндекс.Музыка. Особенности разработки iOS-клиента — Сергей Зайцев](https://reader034.vdocuments.net/reader034/viewer/2022052522/547b2c96b4af9f7a328b45f5/html5/thumbnails/3.jpg)
Кэширование изображений
Каким должен быть хороший кэш картинок?
![Page 4: Новая Яндекс.Музыка. Особенности разработки iOS-клиента — Сергей Зайцев](https://reader034.vdocuments.net/reader034/viewer/2022052522/547b2c96b4af9f7a328b45f5/html5/thumbnails/4.jpg)
Кэширование нужно для ускорения отрисовки картинки
4Измерения проводились при обработке JPEG 700x700 на IPhone 5S, загрузка по 3G.
2000 ms
13 ms
27 ms 400 ms
Загрузка Декодирование Обработка растра
![Page 5: Новая Яндекс.Музыка. Особенности разработки iOS-клиента — Сергей Зайцев](https://reader034.vdocuments.net/reader034/viewer/2022052522/547b2c96b4af9f7a328b45f5/html5/thumbnails/5.jpg)
Типовое решение: двухуровневый кэш
〉Минимальная нагрузка на поток пользователя кэша.
〉Ограничение на использование памяти и диска.
〉URL - первичный ключ картинки.
〉Хэш от URL - уникальная часть в имени файла.
5
![Page 6: Новая Яндекс.Музыка. Особенности разработки iOS-клиента — Сергей Зайцев](https://reader034.vdocuments.net/reader034/viewer/2022052522/547b2c96b4af9f7a328b45f5/html5/thumbnails/6.jpg)
Хорошее решение
〉Кэширование нескольких вариантов картинки (разные размеры, наложение фильтров).
6
![Page 7: Новая Яндекс.Музыка. Особенности разработки iOS-клиента — Сергей Зайцев](https://reader034.vdocuments.net/reader034/viewer/2022052522/547b2c96b4af9f7a328b45f5/html5/thumbnails/7.jpg)
Хорошее решение
〉Кэширование нескольких вариантов картинки (разные размеры, наложение фильтров).
〉Управление количеством одновременно загружаемых и обрабатываемых картинок.
!
!
7
![Page 8: Новая Яндекс.Музыка. Особенности разработки iOS-клиента — Сергей Зайцев](https://reader034.vdocuments.net/reader034/viewer/2022052522/547b2c96b4af9f7a328b45f5/html5/thumbnails/8.jpg)
Хорошее решение
〉Кэширование нескольких вариантов картинки (разные размеры, наложение фильтров).
〉Управление количеством одновременно загружаемых и обрабатываемых картинок.
〉По-настоящему уникалные имена файлов.
!
8
![Page 9: Новая Яндекс.Музыка. Особенности разработки iOS-клиента — Сергей Зайцев](https://reader034.vdocuments.net/reader034/viewer/2022052522/547b2c96b4af9f7a328b45f5/html5/thumbnails/9.jpg)
Хорошее решение
〉Кэширование нескольких вариантов картинки (разные размеры, наложение фильтров).
〉Управление количеством одновременно загружаемых и обрабатываемых картинок.
〉Не использовать хэш в качестве имени файла.
〉Обновление картинок.
9
![Page 10: Новая Яндекс.Музыка. Особенности разработки iOS-клиента — Сергей Зайцев](https://reader034.vdocuments.net/reader034/viewer/2022052522/547b2c96b4af9f7a328b45f5/html5/thumbnails/10.jpg)
〉На клиенте генерируется несколько вариантов картинки.
Кэшируем обработанные картинки, если
10
![Page 11: Новая Яндекс.Музыка. Особенности разработки iOS-клиента — Сергей Зайцев](https://reader034.vdocuments.net/reader034/viewer/2022052522/547b2c96b4af9f7a328b45f5/html5/thumbnails/11.jpg)
Кэшируем обработанные картинки, если
〉На клиенте генерируется несколько вариантов картинки.
〉Устройство не успевает обработать картинку ”на лету”.
11
![Page 12: Новая Яндекс.Музыка. Особенности разработки iOS-клиента — Сергей Зайцев](https://reader034.vdocuments.net/reader034/viewer/2022052522/547b2c96b4af9f7a328b45f5/html5/thumbnails/12.jpg)
Кэшируем обработанные картинки, если
〉На клиенте генерируется несколько вариантов картинки.
〉Устройство не успевает обработать картинку ”на лету”.
〉Обработанная картинка будет многократно использована.
12
![Page 13: Новая Яндекс.Музыка. Особенности разработки iOS-клиента — Сергей Зайцев](https://reader034.vdocuments.net/reader034/viewer/2022052522/547b2c96b4af9f7a328b45f5/html5/thumbnails/13.jpg)
Варианты реализации обновления
〉Сервер генерирует уникальные URL для новых картинок.
13
![Page 14: Новая Яндекс.Музыка. Особенности разработки iOS-клиента — Сергей Зайцев](https://reader034.vdocuments.net/reader034/viewer/2022052522/547b2c96b4af9f7a328b45f5/html5/thumbnails/14.jpg)
Варианты реализации обновления
〉Сервер генерирует уникальные URL для новых картинок.
〉 Клиент проверяет установленные сервером HTTP заголовки (cache-control, last-modified, ETag).
14
![Page 15: Новая Яндекс.Музыка. Особенности разработки iOS-клиента — Сергей Зайцев](https://reader034.vdocuments.net/reader034/viewer/2022052522/547b2c96b4af9f7a328b45f5/html5/thumbnails/15.jpg)
Варианты реализации обновления
〉Сервер генерирует уникальные URL для новых картинок.
〉Клиент проверяет установленные сервером HTTP заголовки (cache-control, last-modified, ETag).
〉По инициативе клиента (каждый раз, по таймеру, при выходе приложения из бэкграунда…).
15
![Page 16: Новая Яндекс.Музыка. Особенности разработки iOS-клиента — Сергей Зайцев](https://reader034.vdocuments.net/reader034/viewer/2022052522/547b2c96b4af9f7a328b45f5/html5/thumbnails/16.jpg)
Варианты реализации обновления
〉Сервер генерирует уникальные URL для новых картинок.
〉Клиент проверяет установленные сервером HTTP заголовки (cache-control, last-modified, ETag).
〉По инициативе клиента (каждый раз, по таймеру, при выходе приложения из бэкграунда…).
Обновление зависимых картинок
16
![Page 17: Новая Яндекс.Музыка. Особенности разработки iOS-клиента — Сергей Зайцев](https://reader034.vdocuments.net/reader034/viewer/2022052522/547b2c96b4af9f7a328b45f5/html5/thumbnails/17.jpg)
Чтобы получить хороший кэш
〉Кэшируйте обработанные картинки.
〉Ограничивайте нагрузку на CPU и память.
〉Используйте уникальные имена файлов.
〉Позаботьтесь об обноволении картинок.
!
17
![Page 18: Новая Яндекс.Музыка. Особенности разработки iOS-клиента — Сергей Зайцев](https://reader034.vdocuments.net/reader034/viewer/2022052522/547b2c96b4af9f7a328b45f5/html5/thumbnails/18.jpg)
Стриминг и кэширование музыки
![Page 19: Новая Яндекс.Музыка. Особенности разработки iOS-клиента — Сергей Зайцев](https://reader034.vdocuments.net/reader034/viewer/2022052522/547b2c96b4af9f7a328b45f5/html5/thumbnails/19.jpg)
Особенности
〉Для кэширования и стриминга используется общий загрузчик.
19
![Page 20: Новая Яндекс.Музыка. Особенности разработки iOS-клиента — Сергей Зайцев](https://reader034.vdocuments.net/reader034/viewer/2022052522/547b2c96b4af9f7a328b45f5/html5/thumbnails/20.jpg)
Особенности
〉Для кэширования и стриминга используется общий загрузчик.
〉Специализированный загрузчик.
20
![Page 21: Новая Яндекс.Музыка. Особенности разработки iOS-клиента — Сергей Зайцев](https://reader034.vdocuments.net/reader034/viewer/2022052522/547b2c96b4af9f7a328b45f5/html5/thumbnails/21.jpg)
Особенности
〉Для кэширования и стриминга используется общий загрузчик.
〉Собственный загрузчик.
〉Собственный UI плейера.
21
![Page 22: Новая Яндекс.Музыка. Особенности разработки iOS-клиента — Сергей Зайцев](https://reader034.vdocuments.net/reader034/viewer/2022052522/547b2c96b4af9f7a328b45f5/html5/thumbnails/22.jpg)
Схема стриминга
22
Кэш
Загрузчик
Управление стримингом Audio Queue
UI
Данные
16Кб
Управление
![Page 23: Новая Яндекс.Музыка. Особенности разработки iOS-клиента — Сергей Зайцев](https://reader034.vdocuments.net/reader034/viewer/2022052522/547b2c96b4af9f7a328b45f5/html5/thumbnails/23.jpg)
Тюнинг
〉Воспроизведение кусками по 16 КБ.
23
![Page 24: Новая Яндекс.Музыка. Особенности разработки iOS-клиента — Сергей Зайцев](https://reader034.vdocuments.net/reader034/viewer/2022052522/547b2c96b4af9f7a328b45f5/html5/thumbnails/24.jpg)
Тюнинг
〉Воспроизведение кусками по 16 КБ.
〉Ограничение частоты обновления прогресса скачивания.
24
![Page 25: Новая Яндекс.Музыка. Особенности разработки iOS-клиента — Сергей Зайцев](https://reader034.vdocuments.net/reader034/viewer/2022052522/547b2c96b4af9f7a328b45f5/html5/thumbnails/25.jpg)
Тюнинг
〉Воспроизведение кусками по 16 КБ.
〉Ограничение частоты уведомлений о прогрессе скачивания.
〉Ручное управление транзакциями СУБД.
25
![Page 26: Новая Яндекс.Музыка. Особенности разработки iOS-клиента — Сергей Зайцев](https://reader034.vdocuments.net/reader034/viewer/2022052522/547b2c96b4af9f7a328b45f5/html5/thumbnails/26.jpg)
Выводы
〉Кэширование и стриминг должны использовать общий загрузчик.
〉Стриминг должен хорошо работать на медленных соединениях.
〉Нагрузка на вычислительные ресурсы должна быть управляемой.
26
![Page 27: Новая Яндекс.Музыка. Особенности разработки iOS-клиента — Сергей Зайцев](https://reader034.vdocuments.net/reader034/viewer/2022052522/547b2c96b4af9f7a328b45f5/html5/thumbnails/27.jpg)
27
Сергей Зайцев
Старший разработчик
Контакты
@libra_rf
sergey.zaytsev.5264
+7 (913) 919 59 95