Юрий Буянов | (Одноклассники)Нюансы разработки...

Preview:

Citation preview

Сообщения Одноклассников

Нюансы разработки мобильного мессенджера

Юрий Буянов“Одноклассники” 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

Recommended