Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Pagination Demystified

Pagination Demystified

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

Egor Tolstoy

March 30, 2016
Tweet

More Decks by Egor Tolstoy

Other Decks in Technology

Transcript

  1. DISCLAIMER ВЫСТУПЛЕНИЕ ОСНОВАНО НА ЛИЧНОМ СТРАДАНИЯХ ОПЫТЕ. ДОКЛАД СОДЕРЖИТ ДЕТАЛЬНОЕ

    ОПИСАНИЕ ОТВРАТИТЕЛЬНЫХ КОСТЫЛЕЙ И ПОЭТОМУ НЕ РЕКОМЕНДУЕТСЯ К ПРОСМОТРУ НИКОМУ.
  2. 0 1 2 cache server 0 1 2 3 4

    5 6 7 offset: 3 limit: 5 3 4 5 6 7
  3. 0 1 2 cache server 0 1 2 3 4

    5 6 7 offset: 3 limit: 5 3 4 5 6 7 3 4 5 6 7 3 4 5 6 7
  4. cache server 0 1 2 21:04- 21:02- 19:35- 19:18- 17:44-

    16:02- 15:58- 15:49- 15:40- 3 4 5 6 7 8 0 1 2 19:35- 19:18- 17:44- 15:21- 9
  5. cache server 0 1 2 21:04- 21:02- 19:35- 19:18- 17:44-

    16:02- 15:58- 15:49- 15:40- 3 4 5 6 7 8 0 1 2 19:35- 19:18- 17:44- since: 17:44 limit: 5 15:21- 9 3 4 5 6 7 16:02- 15:58- 15:49- 15:40- 15:21-
  6. cache server 0 1 2 21:04- 21:02- 19:35- 19:18- 17:44-

    16:02- 15:58- 15:49- 15:40- 3 4 5 6 7 8 0 1 2 19:35- 19:18- 17:44- since: 17:44 limit: 5 15:21- 9 3 4 5 6 7 16:02- 15:58- 15:49- 15:40- 15:21- 16:02- 15:58- 15:49- 15:40- 5 6 7 8 15:21- 9
  7. Изменение количества элементов Актуальность выдачи Обновление контента • Лента статична

    • Новые элементы добавляются сверху • Любая часть выдачи может быть изменена • Выдача всегда актуальна • Выдача может быть переформирована • Отображаемые данные не обновляются • Отображаемые данные могут быть изменены
  8. 1. Количество элементов не меняется 2. Выдача всегда актуальна 3.

    Данные могут быть изменены Афиша.Рестораны
  9. 1. Количество элементов не меняется 2. Выдача может быть переформирована

    3. Данные не могут быть изменены Рамблер.Новости
  10. 1. Любая часть выдачи может быть изменена 2. Выдача всегда

    актуальна 3. Данные могут быть изменены Рамблер.Почта
  11. item 0 item 1 item 2 item 3 item 4

    item 5 item 6 item 7 item 8 item 9 Загрузка вниз Случай 1: Лента статична 1/5
  12. item 0 item 1 item 2 item 3 item 4

    item 5 item 6 item 7 item 8 item 9 offset: 0 limit: 5 Загрузка вниз Случай 1: Лента статична 2/5
  13. item 0 (cached) item 1 (cached) item 2 (cached) item

    3 (cached) item 4 (cached) item 5 item 6 item 7 item 8 item 9 offset: 0 limit: 5 Загрузка вниз Случай 1: Лента статична 3/5
  14. item 0 (cached) item 1 (cached) item 2 (cached) item

    3 (cached) item 4 (cached) item 5 item 6 item 7 item 8 item 9 offset: 0 limit: 5 offset: 5 limit: 5 Загрузка вниз Случай 1: Лента статична 4/5
  15. item 0 (cached) item 1 (cached) item 2 (cached) item

    3 (cached) item 4 (cached) item 5 (cached) item 6 (cached) item 7 (cached) item 8 (cached) item 9 (cached) offset: 0 limit: 5 offset: 5 limit: 5 Загрузка вниз Случай 1: Лента статична 5/5
  16. item 0 (cached) item 1 (cached) item 2 (cached) item

    3 (cached) item 4 (cached) item 5 item 6 item 7 item 8 item 9 offset: 0 limit: 5 Загрузка вниз Случай 2: Добавились новые элементы 1/5
  17. item 0 (cached) item 1 (cached) item 2 (cached) item

    3 (cached) item 4 (cached) item 5 item 6 item 7 item 8 item 9 offset: 0 limit: 5 item 0' (new) item 2' (new) Загрузка вниз Случай 2: Добавились новые элементы 2/5
  18. item 0 (cached) item 1 (cached) item 2 (cached) item

    3 (cached) item 4 (cached) item 5 item 6 item 7 item 8 item 9 offset: 0 limit: 5 offset: 5 limit: 5 item 0' (new) item 2' (new) Загрузка вниз Случай 2: Добавились новые элементы 3/5
  19. item 0 (cached) item 1 (cached) item 2 (cached) item

    3 (cached) item 4 (cached) item 5 (cached) item 6 (cached) item 7 (cached) item 8 item 9 offset: 0 limit: 5 offset: 5 limit: 5 item 0' (new) item 2' (new) Загрузка вниз Случай 2: Добавились новые элементы 4/5
  20. item 0 (cached) item 1 (cached) item 2 (cached) item

    3 (cached) item 4 (cached) item 5 (cached) item 6 (cached) item 7 (cached) item 8 item 9 offset: 0 limit: 5 offset: 5 limit: 5 offset: 8 + 2 item 0' (new) item 2' (new) Загрузка вниз Случай 2: Добавились новые элементы 5/5
  21. item 0 (cached) item 1 (cached) item 2 (cached) item

    3 (cached) item 4 (cached) item 5 item 6 item 7 item 8 item 9 offset: 0 limit: 5 Загрузка вниз Случай 3: Удалены старые элементы 1/7
  22. item 0 (cached) item 1 (cached) item 2 (cached) item

    3 (cached) item 4 (cached) item 5 item 6 item 7 item 8 item 9 offset: 0 limit: 5 item 10 item 11 Загрузка вниз Случай 3: Удалены старые элементы 2/7
  23. item 0 (cached) item 1 (cached) item 2 (cached) item

    3 (cached) item 4 (cached) item 5 item 6 item 7 item 8 item 9 offset: 0 limit: 5 item 10 item 11 offset: 5 limit: 5 Загрузка вниз Случай 3: Удалены старые элементы 3/7
  24. item 0 (cached) item 1 (cached) item 2 (cached) item

    3 (cached) item 4 (cached) item 5 item 6 item 7 (cached) item 8 (cached) item 9 (cached) offset: 0 limit: 5 item 10 (cached) item 11 (cached) offset: 5 limit: 5 Загрузка вниз Случай 3: Удалены старые элементы 4/7
  25. item 0 (cached) item 1 (cached) item 2 (cached) item

    3 (cached) item 4 (cached) item 5 item 6 item 7 item 8 item 9 offset: 0 limit: 5 ... Загрузка вниз Случай 3: Удалены старые элементы 5/7
  26. item 0 (cached) item 1 (cached) item 2 (cached) item

    3 (cached) item 4 (cached) item 5 item 6 item 7 item 8 item 9 offset: 0 limit: 5 ... offset: 4 limit: 5 Загрузка вниз Случай 3: Удалены старые элементы 6/7
  27. item 0 (cached) item 1 (cached) item 2 (cached) item

    3 (cached) item 4 (cached) item 5 (cached) item 6 (cached) item 7 (cached) item 8 (cached) item 9 offset: 0 limit: 5 ... offset: 4 limit: 5 Загрузка вниз Случай 3: Удалены старые элементы 7/7
  28. item 0 item 1 item 2 item 3 item 4

    item 5 item 6 item 7 item 8 item 9 Загрузка вниз Случай 4: Порядок выдачи пересобирается 1/5
  29. item 0 item 1 item 2 item 3 item 4

    item 5 item 6 item 7 item 8 item 9 items: 0,1,2,3,4 Загрузка вниз Случай 4: Порядок выдачи пересобирается 2/5
  30. item 0 (cached) item 1 (cached) item 2 (cached) item

    3 (cached) item 4 (cached) item 5 item 6 item 7 item 8 item 9 items: 0,1,2,3,4 Загрузка вниз Случай 4: Порядок выдачи пересобирается 3/5
  31. item 6 item 1 (cached) item 4 (cached) item 5

    item 8 item 9 item 2 (cached) item 0 (cached) item 7 item 3 (cached) Загрузка вниз Случай 4: Порядок выдачи пересобирается 4/5
  32. item 6 (cached) item 1 (cached) item 4 (cached) item

    5 (cached) item 8 (cached) item 9 (cached) item 2 (cached) item 0 (cached) item 7 (cached) item 3 (cached) items: 5,6,7,8,9 Загрузка вниз Случай 4: Порядок выдачи пересобирается 5/5
  33. item 0 (new) item 1 (new) item 2 (new) item

    3 (new) item 4 (new) item 5 (new) item 7 (cached) item 8 (cached) item 9 (cached) item 6 (new) Обновление Случай 1: Появилось много новых элементов 1/3
  34. item 7 (cached) item 8 (cached) item 9 (cached) offset:

    0 limit: 5 item 0 (new) item 1 (new) item 2 (new) item 3 (new) item 4 (new) item 5 (new) item 6 (new) Обновление Случай 1: Появилось много новых элементов 2/3
  35. item 0 (cached) item 1 (cached) item 2 (cached) item

    3 (cached) item 4 (cached) item 5 (new) item 7 (cached) item 8 (cached) item 9 (cached) offset: 0 limit: 5 item 6 (new) Обновление Случай 1: Появилось много новых элементов 3/3
  36. item 0 (cached) item 1 (cached) item 3 (cached) item

    4 (cached) item 6 (cached) item 7 (cached) item 8 (deleted) item 9 (cached) item 5 (new) item 2 (new) Обновление Случай 2: Свободно изменяемая лента 1/1
  37. for (ShortPost *post in snapshot) { if (![cachedPosts containsObject:post]) {

    [self downloadPost:post]; } } for (Post *post in cachedPosts) { if (![snapshot containsObject:post]) { [self deletePost:post]; } }
  38. item 6 item 1 (cached) item 4 (cached) item 5

    item 8 item 9 item 2 (cached) item 0 (cached) item 7 item 3 (cached) Обновление Случай 3: Порядок выдачи пересобирается 1/1
  39. item 0 (cached) item 1 (updated) item 2 (cached) item

    3 (updated) item 4 (updated) item 5 item 6 item 7 item 8 item 9 Обновление Случай 4: Данные элементов меняются 1/1
  40. for (NSUInteger i = 0; i < cachedPosts.count; i++) {

    Post *cachedPost = cachedPosts[i]; ShortPost *post = snapshot[i]; if (![cachedPost isEqual:post]) { [cachedPost updatePostWithShortPost:post]; } }
  41. posts: NSArray <Post *> snapshot: NSArray <NSString *> offset: NSUInteger

    maxCount: NSUInteger lastModified: NSDate Feed