Случайны выбор дневника Раскрыть/свернуть полный список возможностей


Найдено 16724 сообщений
Cообщения с меткой

facebook - Самое интересное в блогах

Следующие 30  »
rss_rss_hh_new

Выгодно ли Apple быть союзником Google в борьбе за рынок интернет-рекламы

Среда, 27 Июля 2016 г. 18:07 (ссылка)





Кто-нибудь помнит, что несколькими годами ранее компания Google была недосягаемым лидером на рынке интернет-рекламы? Теперь на этом рынке компания вынуждена конкурировать с Facebook.



Google и Facebook – крупнейшие игроки на этом рынке. Доля остальных компаний (Twitter, Yahoo, Pandora) незначительна, поэтому они пока не могут составить серьезную конкуренцию лидерам.



В последнее время Facebook активно стремится догнать конкурента. По подсчетам eMarketer, в 2014 году на долю Google в сегменте мобильной рекламы США приходилось 36,9%, Facebook — 18,5%. Через год их доли составили 32,9% и 19,4% соответственно. Однако Google так просто не сдаст свои позиции.

Между тем, продолжает расти и сам рынок. За 2015 год объем американского рынка интернет-рекламы увеличился на 20,4%. По данным PricewaterhouseCoopers и Interactive Advertising Bureau, рекламодатели стали тратить на digital $59,6 миллиарда.



35% их затрат пришлось на мобильную рекламу, что на 10% превышает аналогичный показатель 2014 года.








Аналитики Goldman Sachs отмечают, что Google стремится вырасти на рынке интернет-рекламы за счет сотрудничества с Apple. Более того, компании заключили сделку, согласно которой поисковик Google теперь предустановлен в браузер Safari по умолчанию.



За 2015 год доходы Google от мобильной поисковой рекламы достигли $11,8 миллиарда. По оценкам аналитиков Goldman Sachs, почти $9 миллиардов компания заработала благодаря пользователям iPhone и iPad. Safari обеспечил половину этой суммы. Владельцы iOS-устройств вводят запросы не только в Safari, но и в браузере Chrome, и в iOS-приложениях Google.



За ту сделку Google заплатила Apple $1 миллиард. Принимая во внимание заслуги Apple, аналитики Goldman Sachs полагают, что для сохранения этого источника дохода Google готова заплатить яблочной компании еще больше.



Как на эту ситуацию смотрит корпорация Apple



Google отдает партнеру часть рекламной выручи, которую обеспечивают iOS-устройства.

На основе информации, которая «утекла» из зала суда во время слушания спора Oracle-Google, эксперты сделали вывод, что Apple получает примерно треть.



Более половины поисковых запросов Google приходится на мобильные устройства. Ту же тенденцию демонстрируют сайты, которые используют Google Analytics. Свыше 50% аудитории выходят в интернет со смартфонов и планшетов. Если сведения о рекламном «откате» Apple верны, то последняя вряд ли захочет прервать сотрудничество. Разве что, это может случиться по идеологическим соображениям.



Известно, что Apple не одобряет многие действия Google. Более того, у Стива Джобса, а позднее, и у всей корпорации, была своя позиция по поводу, приватности, рекламы, маркетинга и отношений с пользователями в принципе. Нынешний гендиректор Apple Тим Кук в публичном сообщении вновь обозначил эту позицию:



«Наша бизнес-модель очень проста: мы продаем отличные продукты. Мы не заводим досье на каждого пользователя, используя его email и информацию о веб-серфинге, чтобы потом продавать их рекламодателям. Мы не «монетизируем» информацию с ваших iPhone или iCloud. И мы не читаем ваши письма и сообщения, чтобы потом использовать эту информацию в маркетинговых целях. Наши программные продукты и сервисы разрабатываются, чтобы наши устройства работали лучше».







Говоря о том, что компания не делает, и не собирается делать, Кук имел в виде «проделки» Facebook, Twitter и Google. Так что, взгляды Apple и Google по вопросам отношений с пользователями кардинально расходятся. И в ближайшее ситуация вряд ли изменится.



В дальнейшем позиция Apple по отношению к рекламной индустрии станет еще жестче, предполагают эксперты TechCrunch.



Прогнозы



В 2016 году затраты рекламодателей на мобильное SEO и PPC превысят расходы на десктопный поисковый маркетинг, прогнозирует eMarketer. Это свидетельствует о том, что доля мобильной поисковой рекламы Google будет зависеть от Apple еще сильнее.







Точная дата истечения срока соглашения о сотрудничестве между Apple и Google неизвестна. По предположениям экспертов, это произойдёт в нынешнем году. Ранее сообщалось, что Microsoft и Yahoo также претендуют на позицию поиска по умолчанию в Safari.



По прогнозу компании Strategy Analytics, к концу 2022-ого года число аудитория мобильного видео вырастет до 2 миллиардов человек.



В попытке «завоевать мир», рекламодатели будут вкладывать еще больше средств в мобильную видеорекламу, стараясь охватить как можно больше пользователей смартфонов и планшетов.

Посредниками в процессе рекламной монетизации все чаще выступают Facebook, Twitter, WeChat и остальные социальные сети.



Ежедневно Facebook генерирует более 8 миллиардов просмотров. Представители рекламных агентств отмечают, что по цене просмотров YouTube (напомним, что это сервис Google) оказывается дешевле Facebook в 9 из 10 случаев.



Тем не менее, иногда рекламодатели отдают предпочтение Facebook из-за наличия целевой аудитории. Они полагают, что будет проще продать таким пользователям услуги или товары через свои каналы.



Но не все так благополучно, как хотели бы видеть рекламодатели.







Число владельцев смартфонов, использующих ПО для блокировки рекламы, согласно последнему отчету PageFair выросло на 90% за последний год. В общей сложности, рекламу на смартфонах блокирует почти 420 миллионов пользователей по всему миру. По статистике — это каждое пятое мобильное устройство на планете.



Активно блокируют рекламу жители азиатско-тихоокеанского региона — там блокировщики установлены на 36% устройств. В Индии и Индонезии adblock-приложения использует две трети всех владельцев смартфонов. В Китае блокировщики установлены на 159 миллионов устройств.
Original source: habrahabr.ru.

https://habrahabr.ru/post/306558/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best

Комментарии (0)КомментироватьВ цитатник или сообщество
gemchuginkaII

хохмы от Яночки продолжаются...

Среда, 27 Июля 2016 г. 12:57 (ссылка)

Яна Лисицина

11 ч ·

Мы были на балете "Лебединое озеро", и это оказалось стратегической ошибкой, потому что если бы пошли на какую-нибудь "Грозу" или "Вишневый сад", то вряд ли в театр пришла та часть Китая, которая не отдыхает на Байкале. Китайцы подошли к культурному походу основательно: выкупили ряды, запаслись пластиковыми бутылками с водой и бодрым китайским настроением, в которое входило громкое обсуждение каждого персонажа всей группой одновременно, стучание ногами, а также различные звуки, уведомляющие об несомненном удовлетворении от обеда. Сначала они повосторгались мужским балетом в классических белых трико. По-видимому, еще с времен Мао Цзе-дуна, а может, вообще императоров, китайские мужики в обтягушках не ходят. Шум Азии перевалил оркестровую яму и достиг сцены, потому что когда Зигфрид танцевал с арбалетом, то особенно тщательно целился в сторону китайцев. Но никто не был убит, и мы поняли, что Зигфрид мазила. Потом китайцы стали орать в сторону танца маленьких лебедей, и тут даже не выдержал толерантный второй ряд, состоящий из европейцев. Они поворачивались и внятно смотрели на жителей Поднебесной. Те притихли, стали орать шепотом и просто греметь бутылками. Оркестр усилил мощь, подступал катарсис. Сидящая рядом со мной китаянка монотонно кашляла в такт, я оценила деликатность момента. Когда все закончилось, и артисты вышли на поклон, то китайцы особенно дружно приветствовали дирижера. Я была с ними солидарна - перекрыть Шанхай не всякий сможет.
Я подумала, что зря рефлексировала полдня - допустимо ли прийти в театр не в вечернем туалете. Надеюсь, никто не заметил, что я без перчаток.

13626432_10206264140034245_6592758466668042111_n (700x420, 31Kb)
Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
Prazanka

Чешские будни в вопросах

Среда, 27 Июля 2016 г. 12:43 (ссылка)


ЧЕХИЯ ОНЛАЙН - НОВОСТИ



Cообщество czech_online  имеет зеркало на Фэйсбуке



Страница Чехия Онлайн - новости, актуальные мероприятия, афиша событий и подписка на мероприятия

https://www.facebook.com/blogczru/ - страница новостей

https://www.facebook.com/blogczru/events - афиша событий по всей Чехии



Группа на Фэйсбуке для повеседневного общения и дискуссий на все темы

https://www.facebook.com/groups/blogczru/



От этой группы отдельно выделены подгруппы на такие темы:



Читать далее...
Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
Александр_Божьев

Глава 1320. 24 июля 2016 года. 206 день 2016 года. НАШИ ОТЦЫ и ДЕДЫ ВСЁ ЭТО СЛЫШАЛИ. Сборная России поедет на Олимпиаду. Розыск. Александр Божьев.

Воскресенье, 24 Июля 2016 г. 06:09 (ссылка)





Наши деды слышали все проклятия и обвинения в адрес России, которые прозвучали на недавнем Варшавском саммите НАТО, накануне 1941 года. На этот раз "сдерживать и устрашать" Россию призывает генсек НАТО Столтенберг. Его кукловод, американский зам. генсека НАТО Александр Вершбоу, как и положено начальнику, более солиден и расплывчат, заявил о "полосе серьёзной напряжённости с Россией".
Особенно же "порадовал" Антоний Мачеревич, просто геббельсовским историческим открытием: оказывается, "Россия дала толчок Волынской резне", хотя Мачеревич всего лишь министр обороны Польши. А как закончил этот министр-историк: "Любая агрессия происходит из Москвы!" Да, Россия виновата: не признала бандеровский госпереворот в Киеве, не дала превратить Крым в Хатынь и американскую базу, и Донбасс не сдала... Одесскую же Хатынь и Донбасскую Волынь эти варшавские гуманоиды в упор не видят.А Россия видит... не только Варшавскую ложь, но и проспект им. Бандеры в Киеве, и ракетные американские базы ПРО в Польше и Румынии, даже М.С. Горбачёв заметил, что "НАТО готовится к реальной войне с Россией"... Всё это было, с поправкой на ХХ век, перед 1941 годом. И Англия опять отделилась от континента, погружающегося в коричневую чуму."Отношение к России не будет прежним", - пугают в Варшаве. Испугали... Более важно другое: как ко всему этому отнесётся Россия сегодня? Что со всем этим России делать?"Таких друзей за хобот - и в музей", - предлагает известный политолог-историк Евгений Сатановский, однако, в данном случае, стоит взять паузу, поскольку, в действительности, Мачеревич, и ему подобные квазинацисты, имя которым - легион, могут быть полезны России в деле развала НАТО, ибо они являются и "полезными идиотами", по европейской классификации. "Полезные идиоты" на высоких постах в НАТО таких дел натворят - и нам мало не покажется. Пожалуй, можно учредить орден: "Полезный идиот для России", коим награждать иностранных наших "друзей", помимо их воли оказывающих услуги России. Антоний Мачеревич достоин получить награду "ПИдР" № 1. Историческое открытие Мачеревича о "российском толчке" бандеровцам просто конгениально. Поскольку Россия опять даёт "толчок", теперь через Мачеревича, который сумел одним своим заявлением поставить в дурацкое положение и Варшаву и Бандеру. Ведь кому выгодно открытие Мачеревича? По большому счёту, России. Доказательствами Мачеревич себя не утруждает - ложь не нуждается в доказательствах. Поэтому политический эффект может превзойти все ожидания: бандеровцы объявлены безмозглыми инструментами Москвы, а полякам предлагается лобызаться с их убийцами на Волыни! Вообще, России нужно делать выводы из всего этого... Нельзя больше "спасать Европу", как в Великую Отечественную войну, будь что будет с ней сегодня! Проклясть и забыть, всех небратьев, и предателей, взывающих при случае к славянским корням. Каин и Авель были родными братьями, но это не спасло, а погубило Авеля!Пора заканчивать бандеровскую партию с Америкой. Объявить шах: заявить о бандеровско-нацистском режиме на Украине, и потребовать немедленной его денацификации. Ввести санкции против Бандеры за срыв Минских договорённостей и артиллерийские обстрелы Донбасса, террор на оккупированных юго-восточных территориях Украины. Санкции энергетические, транзитные и другие. Поставить перед Западом вопрос о денацификации Украины как условии нормализации отношений. И "укреплять духовные основы и материальное благосостояние страны", как сказал В.Путин на Валааме, то есть армию, ВМФ и ВКС России. Почему-то думается, что Путин на Валааме не просто так молился, вместе с Патриархом, но собирался с духом, чтобы принять важные решения... Какие? Не будем спешить... Вообще, может быть, нам стоит прислушаться к Горбачёву, что НАТО готовится к реальной войне, и расценить Варшавский саммит, с его батальонами и базами ПРО, как повод для объявления войны НАТО? Почему нет? Ждать, пока они базы ПРО зарядят ракетами большой дальности? Может быть, лучше, не дожидаясь этого, разбомбить эти базы ПРО, хуже ведь точно не будет...ПОСТСКРИПТУМ: ,,НАТО готово отправить своих жопошников на заклание и принести жертву " богу" Госдепа... Министр-историк: "Любая агрессия происходит из Москвы!" Не историк, а истерик. Визжит, как баба на базаре. Никогда не признает, что так называемая агрессивность России всего лишь реакция на агрессию запада и визг его сателлитов", в том числе и из внутри России.
Удостоверение 70 лет Победа Александр Божьев (700x482, 50Kb)

24 июля 2016, 21:00
Сборная России поедет на Олимпиаду в Рио де Жанейро. Какие условия выставил МОК?
Главный итог дня и всех последних недель - нам будет за кого болеть на Олимпиаде в Рио. МОК, вопреки призывам, которые звучали в иностранной прессе, не стал отстранять всю нашу сборную от участия в летних играх. Поехать на соревнования в Бразилию смогут не все.
Конкретные имена будут утверждать международные федерации по отдельным видам спорта. Российских спортсменов, которые когда-либо были уличены в употреблении допинга, в Рио если и ждут, то только на трибунах. Это касается и тех, кто уже отбыл срок дисквалификации. А вот "чистым", не замешанным в скандалах МОК будет только рад.
При этом Федерации должны провести индивидуальный анализ антидопинговой истории каждого спортсмена, принимая во внимания только достоверные международные тесты, не беря в расчёт выводы Национального андидопингового агентства.
Откровенно говоря, не все ожидали этого решения. Британская пресса со ссылкой на информированные источники с утра сообщала о том, что Международный олимпийский комитет не допустит всю сборную России к Олимпийским играм в Рио-де-Жанейро. В результате МОК передал международным федерациям право самостоятельно решать вопрос о допуске российских по их видам спорта.
«Мы должны были найти баланс между концепцией коллективной ответственности и индивидуальной справедливостью, которая должна распространяться на любого человека, любого атлета. В результате в своем решении мы исходили из презумпции невиновности российских атлетов, чтобы они избежали коллективной ответственности за то, что описано в докладе господина Макларена», - отметил Томас Бах.
Любопытно, что в последние дни, комментируя доклад независимой комиссии Всемирного антидопингового агентства, президент Международного олимпийского комитета говорил о том, что на российских спортсменов презумпции невиновности не распространяется. Сегодняшнее решение означает обратное.
«С одной стороны, мы могли отстранить всю сборную России, но с другой, в конце дня вы должны посмотреть в глаза атлетов, которые подвергаются вашему решению. Я убежден, что наше решение правильное, мы видим, что многие атлеты по всему миру поддерживают нас. Также могу сказать, что на исполкоме не поднимался вопрос об отстранении российских спортсменов от зимних Олимпийских игр-2018», - заявил Томас Бах.
В итоге исполком МОК решил следующее
Россия провела большую работу по выявлению нарушителей, этому была посвящена большая часть доклада Александра Жукова. После он вышел к журналистам.
До сих пор есть технические неясности относительно того, как этот экстренный олимпийский отбор будут проходить представители командных видов спорта. Любопытно, что в праве участвовать в Олимпийских играх был отказано Юлии Степановой - героине нескольких документальных фильмов немецкого телеканала АРД. Степанова и ее муж Виталий, бывший сотрудник РУСАДА рассказали о системном, с их точки зрения, употребления допинга российскими легкоатлетами. Степанова сама принимала запрещенные препараты, а потому она не прошла по жестким критериям отбора на Олимпийские игры.
Павел Матвеев


Опрос в интернете
Соблюдаете ли вы правила какой-либо религии?
47% (174 голосов) Соблюдаю иногда
31% (114 голосов) Я не религиозен
12% (46 голосов) Вообще не соблюдаю
10% (38 голосов) Да, полностью соблюдаю Проголосовали: 372
Читать больше: http://babalo.info/topics/soblyudaete-li-vy-pravila-kakoj-libo-religii/

Объявлен в розыск
Внимание! Вас ищут!
Today, 5:26 AM
Александр, вы пропустили возможность пообщаться с этой девушкой:
Елена, 56 лет, Москва
Десятки привлекательных девушек искали вас, пока вы были оффлайн. Пора действовать!

Цветок (700x525, 140Kb)
Александр, you have 99 new notifications, 2 new friends and 16 messages.
Today, 6:51 AM
You have new notifications.
A lot has happened on Facebook since you last logged in. Here are some notifications you've missed from your friends.
Александр Божьев
16 messages.
1 event invite
34 group invitations
2 new friends
99 new notifications
Go to Facebook
View Notifications

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
Romeo_Paradise

Romeo Paradise | FaceBook

Суббота, 24 Июля 2016 г. 03:46 (ссылка)
https://www.facebook.com/romeo.paradise


Страница Romeo Paradise на FaceBook.



DSCN0155 (700x480, 358Kb)
Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
piargrupp

PIAR-GRUPP | Социальная сеть Facebook.

Пятница, 22 Июля 2016 г. 20:01 (ссылка)
piar-grupp.eu/info/117-socz...t-facebook

Социальная сеть Facebook.  Социальная сеть Facebook  дает компаниям прекрасную перспекС...
Социальная сеть Facebook дает компаниям прекрасную перспективу повысить узнаваемость и повысить количество продаж. Самое большое преимущество Фейсбука состоит в том, что в ее русскоязычном сегменте конкуренция меньше,чем в контакте или в одноклассниках, хотя постепенно Facebook становится все более популярным среди самой привлекательной для компаний целевой аудитории. Согласно собранным данным, пользователи Facebook, в отличие от ВКонтакте, принимают активное участие в развитии групп и охотно переходят на сторонние сайты по ссылкам с них.
Комментарии (0)КомментироватьВ цитатник или сообщество
piargrupp

PIAR-GRUPP | Фейсбук интересное.

Пятница, 22 Июля 2016 г. 20:01 (ссылка)
piar-grupp.eu/info/118-fejs...interesnoe

Фейсбук интересное.  На корпоративных страницах в этой социальной сети можно ра...
Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

Страх и ненависть и пагинация

Пятница, 22 Июля 2016 г. 10:39 (ссылка)

А в чем проблема?



Типичная пагинация



Как бы нам не хотелось этого отрицать, практика показывает, что подавляющее большинство своего времени типичный iOS-разработчик проводит за работой с табличками. Проектирование сервисного слоя — это интригующе, разработка универсального роутинга в приложении — захватывающе, а от настройки гибких политик кэширования вообще крышу сносит, но работа с табличными интерфейсами — это наши серые будни. Иногда луч света все же попадает и в эту область, и вместо очередной возни с constraint'ами перед нами может встать задача реализации постраничной загрузки — или, как это модно называть в мобильных приложениях, infinite scroll'а.





Грузить сразу все новости, объявления, списки фильмов с удаленного ресурса как минимум не эффективно, поэтому в большинстве случаев сервер предоставляет клиентам различные механизмы разбития всего объема данных на части ограниченного размера.



Как говорится, so far so good. Мы загружаем первую партию данных, отображаем их в таблице, прокручиваем её до конца, загружаем следующую партию — и так до бесконечности. К сожалению — ну или к счастью, мы же любим вызов — на этом все только начинается.



В зависимости от сложности проекта и степени костыльности API, достаточно простая задача рискует переродиться в Нечто. Нечто именно с большой буквы, потому что это создание в итоге обретает свою собственную жизнь и начинает рушить судьбы всех, кто его коснется. Ближе к делу — приведу пример из реальной жизни, случившийся, тем не менее, в совсем абстрактном проекте.



Условия, с которыми нужно было работать:




  • любой из загруженных элементов может быть изменен с течением времени;

  • на стороне клиента нужно уметь прятать посты авторов из черного списка — учитывая, что сервер продолжает их возвращать;

  • несмотря на локальную фильтрацию, при запросе следующей страницы пользователь должен получить не меньше 20 новых элементов;

  • выдача целиком пересобирается раз в час — некоторые посты добавляются, некоторые — исчезают, и обязательно меняются все позиции в списке;

  • обращение к серверу идет не напрямую, а через CDN, что влечет за собой интересные артефакты;

  • единственный механизм постраничной загрузки, который может предложить сервер — это limit/offset.



Плохие новости — сделать в подобных случаях все правильно сложно. Хорошие новости — у меня в запасе есть целый структурированный арсенал костылей, который помогает справиться с большинством возникающих вопросов и проблем.



Декомпозиция



Сколь угодно сложная проблема или задача становится решаемой, если разбить её на ограниченное количество шагов. Наш случай не исключение. Чтобы понять принцип работы всей системы постраничной загрузки в вашем приложении достаточно декомпозировать её на несколько секций:




  1. Правила изменения количества элементов в выдаче:


    • Лента статична. Пример: Список заведений в редакционной подборке. Будучи один раз составленным, он уже не меняется.

    • Новые элементы добавляются строго сверху. Пример: История просмотра страниц приложения. В самом простом виде единственное её изменение — это добавление в начало списка новых просмотров страниц.

    • Любая часть выдачи может быть изменена. Пример: Список писем в почтовом клиенте. Пользователь может удалять, перемещать и получать новые письма, поэтому список может быть изменен на любой позиции.


  2. Правила изменения актуальности выдачи:


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

    • Выдача может быть переформирована в неопределенный момент времени. Пример: Новостное приложение с интеллектуальным ранжированием. Раз в час выдача новостей пересобирается и наиболее актуальные материалы перебираются в самый верх списка.


  3. Правила обновления контента:


    • Отображаемые данные не обновляются. Пример: Ячейки с названиями ресторанов. Смена названий настолько редка, что этой вероятностью можно смело пренебречь.

    • Отображаемые данные могут быть изменены. Пример: Ячейки со счетчиком лайков. С течением времени этот счетчик меняется — и нужно уметь обновлять эти данные для уже закэшированных элементов.




Задача реализации постраничной загрузки чаще всего делится на две крупные части: подгрузка данных вниз и обновление ленты, обычно совершаемое при pull-to-refresh. К каждой из этих задач требуется свой подход, целиком зависящий от приведенной выше схемы.



Костыли



Этот раздел — ключевая часть всего материала. Я собрал все костыли, которые вынужденно использовал при реализации сложного механизма постраничной загрузки на limit/offset.



Небольшой ликбез. Limit/offset — это наиболее часто встречающийся подход к реализации постраничной загрузки данных. Offset — это сдвиг относительно первого элемента. Limit — количество загружаемых данных.



Пример: пользователь хочет загрузить 10 новостей, начиная с двадцатой. offset: 10, limit: 20.


Подгрузка вниз / Лента изменяется



Если лента может быть изменена, не важно каким образом, то при попытке запросить следующую страницу мы можем столкнуться со сдвигом элементов вверх или вниз. Решение проблемы состоит из двух шагов. Первый относится к смещениям вниз. Представим ситуацию, при которой у нас уже загружена первая страница из пяти элементов. До следующего запроса структура данных на сервере изменилась и сверху выдачи добавились два новых элемента. Теперь при загрузке следующей страницы мы получим два элемента, которые у нас уже есть в кэше.



Подгрузка вниз / Лента изменяется



Ситуация может быть и хуже, если за время отсутствия синхронизации на сервер добавилось элементов больше, чем установлено в свойстве limit — тогда мы не получим ни одного нового элемента. Если в качестве offset'а мы будем использовать общее количество элементов в кэше, то застрянем в этой точке навсегда, так как продолжим запрашивать те элементы, которые уже были загружены.



Проблема решается достаточно просто. При получении очередной порции данных мы подсчитываем количество пересечений с закэшированным контентом — и в дальнейшем используем полученное значение как сдвиг offset'а. В приведенном выше примере этот сдвиг будет равен 2.



paging.startIndex = cachedPosts.count + intersections;
paging.count = 5;


Подгрузка вниз / Любая часть выдачи может быть изменена



Рассмотрим следующую ситуацию: мы загрузили страницу, но затем первые два элемента были удалены. Запросив следующую порцию данных, получаем дырку в два элемента. Если ничего не предпринять, приложение об этом ничего не узнает — и данные никогда не загрузятся.



Подгрузка вниз / Любая часть выдачи может быть изменена



Выход из этой ситуации — всегда запрашивать данные с наложением в один элемент. Если при получении данных мы не найдем пересечений — можно либо отменить результат запроса, либо повторить его с другими параметрами.



paging.startIndex = startIndex - 1;
paging.count = 5;


Небольшой лайфхак в копилку — если какие-то элементы в ленте потеряются, всегда можно сделать серьезное лицо и прочитать лекцию про интеллектуальное ранжирование данных, выполняемое на клиенте. Не поверят — покажите Facebook, у которых одна и та же выдача на каждом устройстве всегда выглядит абсолютно по-разному.


Подгрузка вниз / Выдача может быть реструктуризована в случайный момент времени



В таком случае самым простым вариантом реализации будет работа с так называемым слепком ленты. Под этим термином обычно понимают список идентификаторов всех записей выдачи. При первом открытии мы запрашиваем такой слепок и сохраняем его в базе, либо просто держим в памяти. Теперь для получения следующей страницы мы будем пользоваться не стандартным limit/offset, а более сложным запросом — просить сервер отдать посты по конкретным 20 идентификаторам.



NSRange pageRange = NSMakeRange = (startIndex, 20);
NSArray *postIds = [snapshot subarrayWithRange:pageRange];
[self makeRequestWithIds:postIds];


Даже если выдача неожиданно будет реструктуризована, нам это не помешает — мы работаем с тем слепком, который был актуален на момент первого запроса — и для клиента лента будет отсортирована точно также, как в момент первого открытия.



Подгрузка вниз / Выдача может быть реструктуризована в случайный момент времени



Обновление ленты / Элементы добавляются сверху



В этом случае нам в первую очередь необходимо уметь определять наличие дырок, образующихся в том случае, если со времени последней синхронизации было добавлено большое количество новых элементов.

Мы запрашиваем константное количество данных и проверяем наличие пересечений с данными из кэша. Если пересечения есть — все хорошо, можно продолжать работать в обычном режиме. Если пересечений нет — это значит, что мы пропустили несколько постов.



Обновление ленты / Элементы добавляются сверху



Что делать в этом случае — нужно решать для каждого конкретного приложения. Можно сбросить все данные, кроме запрошенных пяти элементов. Можно продолжать подгружать элементы сверху постранично, пока не будут обнаружены пересечения.



if (intersections == 0) {
[self dropCache];
}


Обновление ленты / Любая часть выдачи может быть изменена



У проблемы есть два способа решения:




  1. Сервер отдает diff’ы изменений в ленте, к примеру, основываясь на сохраненном Last-Modified последнего синхронизированного состояния выдачи. Параметр Last-Modified мы получаем из заголовков ответа сервера. Клиенту в таком случае останется просто применить эти изменения на состояние базы.



    for (ShortPost *post in diff) {
    [self updateCacheWith:post];
    }



  2. Если сервер так не умеет — приходится снова писать дополнительную сотню строк на клиенте. Нам нужно получить слепок постов (прямо как в одном из предыдущих пунктов) и сравнить его с текущим состоянием хранимых в кэше данных.



    for (ShortPost *post in snapshot) {
    if (![cachedPosts containsObject:post]) {
    [self downloadPost:post];
    }
    }
    for (Post *post in cachedPosts) {
    if (![snapshot containsObject:post]) {
    [self deletePost:post];
    }
    }





Все отсутствующие в слепке элементы — удалить, все недостающие — загрузить.



Обновление ленты / Меняется сортировка



Если выдача была реструктуризована, мы должны об этом узнать. Проще всего это сделать, послав на сервер head-запрос и сравнив параметры etag или Last-Modified с сохраненными значениями.



NSString *lastModified = [self makeFeedHeadRequest];

if (![lastModified isEqual:cachedLastModified]) {
[self dropCache];
[self obtainPostSnapshot];
[self obtainFirstPage];
}


Если результат сравнения отрицательный — состояние кэша сбрасывается, слепок id обновляется.



Обновление ленты / Элементы выдачи могут меняться



Если элементы списка содержат изменяющиеся со временем данные, вроде рейтинга или количества лайков — их нужно обновлять. Решение проблемы, в принципе, коррелирует с одним из предыдущих пунктов — мы работаем либо с diff’ом, возвращенным сервером, либо запрашиваем краткие структуры данных, содержащие только значимые поля. После этого вручную обновляем состояние элементов.



for (NSUInteger i = 0; i < cachedPosts.count; i++) {
Post *cachedPost = cachedPosts[i];
ShortPost *post = snapshot[i];

if (![cachedPost isEqual:post]) {
[cachedPost updatePostWithShortPost:post];
}
}


Главное — максимально сократить количество передаваемых данных.



Советы на будущее



В завершении хочу дать несколько советов разной степени полезности.



Совет 1, очевидный



Бывает очень удобно иметь специальный объект, описывающий текущую выдачу. Назовите его списком, категорией, фидом — не важно.



@interface Feed: NSObject

@property (nonatomic, copy) NSArray *posts;
@property (nonatomic, copy) NSArray *snapshot;
@property (nonatomic, assign) NSUInteger offset;
@property (nonatomic, assign) NSUInteger maxCount;
@property (nonatomic, strong) NSDate *lastModified;

@end


Он может содержать текущий offset, максимальное количество элементов ленты, дату Last-Modified, слепок id — все, что нужно для описания списка элементов.



Совет 2, архитектурный



Не стоит смешивать в одном месте запросы на получение данных и обработку результатов. Если пытаться сразу же отображать полученные от сервера данные, вы наверняка столкнетесь с рядом проблем и ограничений.

Отделяйте логику запроса данных от логики их получения, обработки и отображения.



Отделяйте логику запроса данных от логики их получения, обработки и отображения



Абстрагируйтесь от сложностей и костылей, которые мы обсудили в этой статье. Наша главная цель — обеспечить постоянную синхронизацию состояния кэша и отображения. Если на экране отображается то же самое, что находится в базе данных — жизнь становится намного проще.



В этом, к примеру, может помочь NSFetchedResultsController, уведомления CoreData или схожие механизмы других ORM.



Совет 3, маскировочный



Инкапсулируйте всю логику обновления ленты и пагинации в отдельном объекте — фасаде над сервисами, занимающимися непосредственной загрузкой.



Именно в этом объекте находятся самые страшные вещи — вложенные блоки, сверка индексов и пересечений, логические ветвления. Для потребителей интерфейс фасада выглядит предельно простым и предоставляет основные методы для работы с постраничными данными — загрузка следующей страницы, обновление списка и полная его перезагрузка. Обратите особое внимание на то, что этот объект должен быть максимально хорошо протестирован.



Совет 4, самый главный



До последнего пытайтесь настоять на нормальной реализации постраничной загрузки на сервере. Limit/offset это, конечно, достаточно гибкое решение, однако клиент должен быть простым. Нет, правда, максимально простым!



Полезные ссылки




Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/306158/

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество

Следующие 30  »

<facebook - Самое интересное в блогах

Страницы: [1] 2 3 ..
.. 10

LiveInternet.Ru Ссылки: на главную|почта|знакомства|одноклассники|фото|открытки|тесты|чат
О проекте: помощь|контакты|разместить рекламу|версия для pda