Юрий Буянов | (Одноклассники)Нюансы разработки...
TRANSCRIPT
Сообщения Одноклассников
Нюансы разработки мобильного мессенджера
Юрий Буянов“Одноклассники” 2016
Что и зачем
Сложности
Типы медиа• текст (с нестандартными смайлами, в том числе,
загружаемыми с сервера)
• картинки
• гифки
• видео
• аудиосообщения
• стикеры
• коллажи (текст + картинки + видео)
Оптимизация
Метрики быстродействия
Оптимизации• Все тяжёлые операции — в фон
• Работа с БД
• Работа с сетью
• Сериализация/десериализация
• Работа с картинками
• Вёрстка и вычисление размеров текста
Оптимизации
• Бенчмаркинг и выбор быстрых решений
• MessagePack
• Mantle -> YYModel
• lz4 fast compression
Оптимизации• Оптимизация рендеринга (избавление от offscreen rendering) —
симптоматически
• UIViewContentModeCenter (по возможности)
• Упрощение иерархий UIView
• Кеширование всего
• “Тяжёлые” UIView
• Информация о размерах / вёрстке
• NSAttributedString
• YYTextLayout
• UIImage (нужного размера, decompressed, скруглённые углы)
Протокол• TCP Socket (+TLS)
• Запрос-ответ
• Server-Side Push
• Транспорт легко поменять:
• Вебсокеты
• Шифрование на уровне пакета
• Фиксированная длина• Opcode• Версия протокола• Длина payload• Seq index (для
связывания запроса с ответом)
Header Payload
• Переменная длина
• LZ4-compressed• MessagePack
Протокол
Синхронизация и кеширование
Синхронизация и кеширование
Чат 4
Чат 3
Чат 2
Чат 1
Чат 4
Чат 3
Чат 2 *
Чат 1
Чат 5 *Offline
Синхронизация и кеширование
Чат 4
Чат 3
Чат 2
Чат 1
Чат 4
Чат 3
Чат 2 *
Чат 1
Чат 5 *Login
chatSync = 1472735750977
Синхронизация и кеширование
Login ACK chats = […]chatSync =
1472735812543Чат 4
Чат 3
Чат 2 *
Чат 1
Чат 5 *
Чат 4
Чат 3
Чат 2 *
Чат 1
Чат 5 *
Синхронизация и кеширование
OnlineЧат 4
Чат 3
Чат 2 *
Чат 1
Чат 5 *
Чат 4
Чат 3
Чат 2 *
Чат 1
Чат 5 *
Кеш сообщений
? ?
Last Message
?ChunkInfoChunkInfo
Закешированные сообщения
Кеш сообщений
? ?
Last Message
?ChunkInfoChunkInfo
Закешированные сообщения
? ? ChunkInfoChunkInfo
Кеш сообщений
? ?
Last Message
?ChunkInfoChunkInfo
Закешированные сообщения
? ? ChunkInfoChunkInfo
? ? ChunkInfoChunkInfo
Реализация
YapDatabase• Key-Value (“на стероидах”)
• NSCoding или кастомная сериализация
• (нам нравится MessagePack)
• Асинхронность и многопоточность
• Объекты не привязаны к контексту
Инициализация БД
Инициализация БД
Транзакции
YapDatabase• Модель транзакций и данных — проще
• (субъективно)
• Осторожнее с параллельным доступом
• Обновляем объекты только в рамках одной транзакции
• Очень просто “реактивизировать” работу с БД
Бесконечный скролл
0
new page
contentOffset
0
Бесконечный скролл
0
new page
contentOffset0
Бесконечный скролл
• Нужно переворачивать ячейки и быть аккуратнее с жестами
• Нужно переворачивать индексы в массиве моделей (пока, секции 🙁)
• Вычисления связанные с contentOffset/Inset немного взрывают мозг
• При скролле вниз проблема возвращается
Обновление списков
• в одну секунду может идти несколько обновлений чата:
• подгрузка истории вверх
• новое сообщение
• обновление статуса старых сообщений (прочитано)
Обновление списков
• Если анимация предыдущего обновления не кончилась, а следующее обновление уже поменяло данные (массив моделей ячеек) — случается креш
• Нужно отложить обновление данных до того момента как анимация закончится
• UIUpdateQueue
UIUpdateQueue
UIUpdateQueue
Спасибо
Юрий Буянов“Одноклассники” 2016ok.ru/digal
twitter.com/digal