Media is too big
VIEW IN TELEGRAM
Выкладываем запись эфира с код-ревью для тех, кто вчера не успел 👀
Всем ещё раз спасибо, было круто! В следующий раз постараемся разобрать больше проектов и сделать эфир поактивнее.
Если вопросы остались, ждём в комментариях, ответим. Будем также рады любой обратной связи 😌
Всем ещё раз спасибо, было круто! В следующий раз постараемся разобрать больше проектов и сделать эфир поактивнее.
Если вопросы остались, ждём в комментариях, ответим. Будем также рады любой обратной связи 😌
👍14🔥6👏2
В чем проблема с выпадающим списком
В прошлый раз мы рассказывали про расширяемые ячейки в UITableView и как в этом поможет RDDM.
Рассмотрим более сложный случай расширяемых ячеек.
На первой картинке виден пример «выпадающего» списка. По нажатию на одну ячейку появляется 2 новых после неё.
Мы могли бы использовать ExpandableItem с вложенным UIStackView, но это будет плохим решением, потому что:
❌ нет переиспользования,
❌ много кода в ячейке,
❌ трудно добавлять элементы с отличающимися размерами.
Все эти пункты влияют на быстродействие работы, чистоту кода и увеличивают накладные расходы по поддержке такого элемента.
Хочешь узнать как делают в Surf❓
С помощью RDDM мы создаём абстрактное описание ячеек — генераторы, которые являются мостом между моделью и ячейкой.
Абстракция на генераторах позволяет нам даже делать вложенные списки внутри вложенных списков 🤯
Подробнее расскажем в посте ниже 👇
В прошлый раз мы рассказывали про расширяемые ячейки в UITableView и как в этом поможет RDDM.
Рассмотрим более сложный случай расширяемых ячеек.
На первой картинке виден пример «выпадающего» списка. По нажатию на одну ячейку появляется 2 новых после неё.
Мы могли бы использовать ExpandableItem с вложенным UIStackView, но это будет плохим решением, потому что:
❌ нет переиспользования,
❌ много кода в ячейке,
❌ трудно добавлять элементы с отличающимися размерами.
Все эти пункты влияют на быстродействие работы, чистоту кода и увеличивают накладные расходы по поддержке такого элемента.
Хочешь узнать как делают в Surf❓
С помощью RDDM мы создаём абстрактное описание ячеек — генераторы, которые являются мостом между моделью и ячейкой.
Абстракция на генераторах позволяет нам даже делать вложенные списки внутри вложенных списков 🤯
Подробнее расскажем в посте ниже 👇
👍7
Знакомство с генераторами на примере выпадающего списка
Мы показали примеры выпадающего списка и познакомили с концепцией, а сегодня расскажем как легко и просто реализовать эту концепцию с помощью RDDM.
Итак, каждой ячейке соответствует генератор, который отвечает на вопросы:
🔹как регистрировать ячейку,
🔹какого размера будет ячейка.
Хорошая новость в том, что в RDDM есть базовый генератор, который подходит для большинства ячеек и позволяет совсем забыть об этих вопросах.
Вернемся к выпадающим спискам из предыдущего поста. Код генератора вы можете видеть на первой картинке, а подключение плагина и инициализацию на второй.
🗣️ И это всё?
🏄♂️ Ага
RDDM делает большую часть работы за вас:
🔹вычисление позиций (IndexPath) для новых ячеек,
🔹вызов UITableView.insertRows при разворачивании списка,
🔹вызов UITableView.removeRows при сворачивании.
Таким образом можно реализовать вложенные списки нескольких уровней вложенности, которые будут переиспользовать ячейки и могут быть быстро модифицированы.
Чтобы подробнее изучить разобранный пример, переходите в репозиторий проекта: где можно посмотреть не только на код примера, но и на реализацию.
Мы показали примеры выпадающего списка и познакомили с концепцией, а сегодня расскажем как легко и просто реализовать эту концепцию с помощью RDDM.
Итак, каждой ячейке соответствует генератор, который отвечает на вопросы:
🔹как регистрировать ячейку,
🔹какого размера будет ячейка.
Хорошая новость в том, что в RDDM есть базовый генератор, который подходит для большинства ячеек и позволяет совсем забыть об этих вопросах.
Вернемся к выпадающим спискам из предыдущего поста. Код генератора вы можете видеть на первой картинке, а подключение плагина и инициализацию на второй.
🗣️ И это всё?
🏄♂️ Ага
RDDM делает большую часть работы за вас:
🔹вычисление позиций (IndexPath) для новых ячеек,
🔹вызов UITableView.insertRows при разворачивании списка,
🔹вызов UITableView.removeRows при сворачивании.
Таким образом можно реализовать вложенные списки нескольких уровней вложенности, которые будут переиспользовать ячейки и могут быть быстро модифицированы.
Чтобы подробнее изучить разобранный пример, переходите в репозиторий проекта: где можно посмотреть не только на код примера, но и на реализацию.
🔥9👍2
Как работают Live Activities — живые виджеты
В iOS 16.1 появились Live Activities — живые виджеты, которые отображают важные пользователю данные.
Например, сколько времени осталось до приезда курьера или такси, пройденное расстояние или текущий этап приготовления блюда в сервисе доставки.
Давайте разберемся, как создавать Live Activities и какие особенности и ограничения у них есть.
Live Activity отображается
🔹 на экране блокировки,
🔹 в Dynamic Island, если он есть,
🔹 наверху экрана, если нет Dynamic Island.
⚠️ Важно, что в активном состоянии Live Activity может находиться до 8 часов. Дальше она будет продолжать отображаться еще 4 часа, но обновления работать уже не будут.
Особенности
👉 У Live Activity нет доступа к сети и к местоположению. Обновлять ее можно только двумя способами:
🔹 из основного приложения
🔹 через пуш-нотификации
👉 Также у Live Activity нет ограничения на частоту обновления. Поэтому её можно использовать для показа актуальных данных в реальном времени.
Ограничения
🙅 Пользователь может отключить Live Activities в настройках: тогда они не будут создаваться и отображаться.
🙅 Невозможно сделать кнопки, но можно использовать диплинки.
🙅 Сильно ограничены анимации. Доступны только несколько видов transition, все остальные анимации не работают. Также есть встроенные стандартные анимации, которые выполняются при обновлении контента.
🙅 Live Activity перестает обновляться, когда приложение переходит в background. Чтобы Live Activity показывала актуальные данные, можно обновлять ее с помощью пуш-нотификаций — даже если приложение выгружено из памяти.
Для работы с Live Activities был создан фреймворк ActivityKit. Как с ним работать, рассказали на картинке ☝️
❓Удалось уже попробовать Live Activities в работе?
В iOS 16.1 появились Live Activities — живые виджеты, которые отображают важные пользователю данные.
Например, сколько времени осталось до приезда курьера или такси, пройденное расстояние или текущий этап приготовления блюда в сервисе доставки.
Давайте разберемся, как создавать Live Activities и какие особенности и ограничения у них есть.
Live Activity отображается
🔹 на экране блокировки,
🔹 в Dynamic Island, если он есть,
🔹 наверху экрана, если нет Dynamic Island.
⚠️ Важно, что в активном состоянии Live Activity может находиться до 8 часов. Дальше она будет продолжать отображаться еще 4 часа, но обновления работать уже не будут.
Особенности
👉 У Live Activity нет доступа к сети и к местоположению. Обновлять ее можно только двумя способами:
🔹 из основного приложения
🔹 через пуш-нотификации
👉 Также у Live Activity нет ограничения на частоту обновления. Поэтому её можно использовать для показа актуальных данных в реальном времени.
Ограничения
🙅 Пользователь может отключить Live Activities в настройках: тогда они не будут создаваться и отображаться.
🙅 Невозможно сделать кнопки, но можно использовать диплинки.
🙅 Сильно ограничены анимации. Доступны только несколько видов transition, все остальные анимации не работают. Также есть встроенные стандартные анимации, которые выполняются при обновлении контента.
🙅 Live Activity перестает обновляться, когда приложение переходит в background. Чтобы Live Activity показывала актуальные данные, можно обновлять ее с помощью пуш-нотификаций — даже если приложение выгружено из памяти.
Для работы с Live Activities был создан фреймворк ActivityKit. Как с ним работать, рассказали на картинке ☝️
❓Удалось уже попробовать Live Activities в работе?
👍5🔥3
Forwarded from Сёрф Технологии
Как пришёл к успеху iOS-разработчик Никита 🍏
Продолжаем делиться историями Cёрферов. Представляем Никиту — iOS Team Lead. Он начал с middle и за полгода дорос до руководителя.
Никита развивает open-source Surf и пишет посты в Telegram-канал Surf iOS Team. О карьерном росте нашего тимлида читай в карточках.
P. S. Идём узнавать истории в отдел Backend 👌
Продолжаем делиться историями Cёрферов. Представляем Никиту — iOS Team Lead. Он начал с middle и за полгода дорос до руководителя.
Никита развивает open-source Surf и пишет посты в Telegram-канал Surf iOS Team. О карьерном росте нашего тимлида читай в карточках.
P. S. Идём узнавать истории в отдел Backend 👌
🔥12❤1👍1🙏1
Лёгкий способ добавить пагинацию на список
Корзины онлайн-магазинов — это длинная выдача. Получать её одной пачкой — расточительство ресурсов.
Логично разделить данные на части и отображать их по мере необходимости. Этот приём называется пагинацией.
При реализации пагинации считается хорошим тоном:
🔹Загружать следующую пачку после показа последней ячейки.
🔹Показывать индикатор процесса загрузки с помощью activityIndicator или кастомной view.
🔹Делать размер одной пачки примерно в 1,5 высоты экрана.
Если последний пункт индивидуален для каждого проекта, то первые два можно унифицировать: что мы и сделали с помощью RDDM.
👉 Плагин paginatable отследит событие показа последней ячейки и сообщит об этом в событии PaginatableOutput.loadNextPage.
👉 Он также поместит индикатор в футер таблицы или коллекции.
👉 Вам останется лишь связать результат загрузки с управляющими сигналами протокола PaginatableInput.
Подробнее о подключении плагина paginatable смотри на картинках и в репозитории проекта.
Корзины онлайн-магазинов — это длинная выдача. Получать её одной пачкой — расточительство ресурсов.
Логично разделить данные на части и отображать их по мере необходимости. Этот приём называется пагинацией.
При реализации пагинации считается хорошим тоном:
🔹Загружать следующую пачку после показа последней ячейки.
🔹Показывать индикатор процесса загрузки с помощью activityIndicator или кастомной view.
🔹Делать размер одной пачки примерно в 1,5 высоты экрана.
Если последний пункт индивидуален для каждого проекта, то первые два можно унифицировать: что мы и сделали с помощью RDDM.
👉 Плагин paginatable отследит событие показа последней ячейки и сообщит об этом в событии PaginatableOutput.loadNextPage.
👉 Он также поместит индикатор в футер таблицы или коллекции.
👉 Вам останется лишь связать результат загрузки с управляющими сигналами протокола PaginatableInput.
Подробнее о подключении плагина paginatable смотри на картинках и в репозитории проекта.
🔥8👍1
Перепись канала! Какой у тебя грейд?
Anonymous Poll
35%
Trainee
23%
Junior
16%
Middle
6%
Senior
20%
Без грейда
👍1
Функциональное реактивное программирование: что за зверь такой
Наверное, каждый iOS-разработчик, открывая вакансии, в требованиях видел: «Необходимо знание фреймворков RxSwift, RxCocoa».
Эти инструменты основаны на концепции реактивного программирования.
Реактивное программирование, как следует из названия, основано на реакции на событие: пользователь взаимодействует с интерфейсом и ждёт реакцию от приложения. Этот подход популярен в фронтенд-разработке, в том числе на iOS.
Мы в Surf долгое время избегали реактивщины в приложениях:
🔹 Во-первых, это лишние зависимости.
🔹 Во-вторых, подобные библиотеки несут в себе не только преимущества, но и проблемы с дебагом, сложностью поддержки кода и так далее.
Однако с выходом Combine и SwiftUI, мы решили начать внедрять реактивный подход в наши приложения. Благо, теперь не нужны сторонние решения: хватит того, что предоставляет Apple.
Если тебе интересно узнать, как работать с реактивным кодом на примере Combine, кидай реакцию к этому посту, и мы обязательно напишем продолжение😉
Наверное, каждый iOS-разработчик, открывая вакансии, в требованиях видел: «Необходимо знание фреймворков RxSwift, RxCocoa».
Эти инструменты основаны на концепции реактивного программирования.
Реактивное программирование, как следует из названия, основано на реакции на событие: пользователь взаимодействует с интерфейсом и ждёт реакцию от приложения. Этот подход популярен в фронтенд-разработке, в том числе на iOS.
Мы в Surf долгое время избегали реактивщины в приложениях:
🔹 Во-первых, это лишние зависимости.
🔹 Во-вторых, подобные библиотеки несут в себе не только преимущества, но и проблемы с дебагом, сложностью поддержки кода и так далее.
Однако с выходом Combine и SwiftUI, мы решили начать внедрять реактивный подход в наши приложения. Благо, теперь не нужны сторонние решения: хватит того, что предоставляет Apple.
Если тебе интересно узнать, как работать с реактивным кодом на примере Combine, кидай реакцию к этому посту, и мы обязательно напишем продолжение
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍27🔥9❤3