Спасибо за вопросы!) В Combine есть разделение на горячие/холодные потоки, а также механизмы «ожидания» подписки до выполнения блока кода. Также есть разные виды паблишеров, по типу эмита событий: one-shot и continuous broadcasting. Для обработки ошибок и дебага тоже есть инструмены, например, операторы .replaceError(), а также .print() и .breakpointOnError().
Ответы на ваши вопросы остались за пределами вводной части, поскольку заслуживают отдельной статьи. Мы их осветим в следующем материале о Combine.
Спасибо за уточнение! Да, Virtual Table и Witness Table тоже работают в рантайме. А пример с протоколом, возможно, для некоторых разработчиков будет считаться и фичей. Но чаще разработчики ошибаются в этом и получают неожиданный результат
Добрый день! Хоть и с запозданием, отвечаем :) Объект (в данным случае структура) будет реализовывать Witness Table соответственно. Но переменные, которые относятся именно к самой структуре, будут по-прежнему реализоваться с Direct Dispatch. Соответственно, у данной структуры будут реализованы Direct Dispatch и Witness Table.
Согласны, что простые решения на определённых проектах лучше. Например, Koin на небольших проектах гораздо легче чем Dagger. А иной раз достаточно и использования Service Locator. Исходя из нашего опыта, с ростом размера проекта и команды достоинства сложных решений перевешивают их недостатки.
Добрый день. Подходы к тестированию могут быть разными в зависимости от команды и проекта. Например, разработчики зачастую пишут юнит-тесты на бизнес-логику для проверки различных граничных случаев, а QA и SDET занимаются более сложными кейсами, интеграционным тестированием и тестированием ui.
Технологии под каждый проект выбираются с учетом всех его особенностей и требований заказчика. ML Kit разделен на пакеты, нет необходимости включать его в проект целиком. В данном случае для сканирования barcodes подключали только ML Kit barcode scanning.
Мы выбрали этот способ для того, чтобы опираться на абстракцию, а не реализацию при продвижении от "глупых" сущностей (data) к "умным" (ui). Это соответствует составляющей D (dependency inversion) в принципе SOLID. Практическая цель - повышение тестируемости компонентов
use_case может как получать, так и сохранять данные. Что касается описания интерфейса, предложенный вами способ тоже выглядит логичным, при этом в примере мы для удобства выбрали другой способ - держать абстракцию и реализацию рядом друг с другом.
Как показано на последней схеме, use case находится между presenter и repository, внедрить use case в цепочку можно через инициализацию в presenter'е, такой способ реализован в примере.
Согласны, архитектуру в флаттере можно рассмотреть на примере многих приложений, как простых, так и более сложных. Руководство при этом может превратиться в настоящую книгу) Однако, наша основная задача заключалась в том, чтобы познакомить новичков с реализацией чистой архитектуры на практике. А какие приложения выбрали бы вы?
Можно вызывать emit сколько угодно раз, при вызове метода из кубита первым действием уведомить UI, вызвав emit(LoadingState()), загрузить данные из интернета, после emit(LoadedState()).
Предположим, что вам необходимо, чтобы на экране с TabBarView каждый таб мог переходить на новый роут. Для этого можно обернуть каждый элемент TabBarView в Navigator, что позволит переходить по роутам каждому табу, не затрагивая глобальный роут.
TabBarView будет выглядеть следующим образом:
Переход на другие роуты внутри таба будет происходить так же, как обычно
Вы правы, Render Effect перерисует соседние элементы. При этом анализироваться будет вся иерархия UI, но не обязательно при этом будет перерисована вся сцена.
Добрый день!
Доклады начнутся в 11:00, каждый из них займет около 25 минут + 10 минут ответы на вопросы. В 13:30 будет кофе-брейк – около получаса, после этого – доклад-дискуссия. Доклады по мобильной разработке и Backend будут проходить в разных залах – «Библиотека» и Brandroom
Спасибо, проверку действительно стоит делать отдельно для каждого слоя, при этом она находится в правильном месте, так как на момент проверки обновленный слой уже должен быть создан
Если нажать на круглую кнопку чуть выше границы таб-бара, ничего не произойдет (а мы хотим, чтобы был выбран соответствующий tabBarItem и поменялся ViewController)
Можно, конечно, ограничиться добавлением экшена для кнопки, но тогда не будет обрабатываться касание на выступающей вверх области кнопки.
Мы добавили в статью ссылку на проект на GitHub. Можно закомментировать переопределенный метод point(inside:with:) в классе CustomTabBar и проверить, как это будет работать без UIResponderChain
Combine: часть 1. Погружение в реактивное программирование
Спасибо за вопросы!)
В Combine есть разделение на горячие/холодные потоки, а также механизмы «ожидания» подписки до выполнения блока кода.
Также есть разные виды паблишеров, по типу эмита событий: one-shot и continuous broadcasting. Для обработки ошибок и дебага тоже есть инструмены, например, операторы .replaceError(), а также .print() и .breakpointOnError().
Ответы на ваши вопросы остались за пределами вводной части, поскольку заслуживают отдельной статьи. Мы их осветим в следующем материале о Combine.
Диспетчеризация в Swift: погружение в теорию и практику
Спасибо за уточнение! Да, Virtual Table и Witness Table тоже работают в рантайме. А пример с протоколом, возможно, для некоторых разработчиков будет считаться и фичей. Но чаще разработчики ошибаются в этом и получают неожиданный результат
Диспетчеризация в Swift: погружение в теорию и практику
Добрый день! Хоть и с запозданием, отвечаем :) Объект (в данным случае структура) будет реализовывать Witness Table соответственно. Но переменные, которые относятся именно к самой структуре, будут по-прежнему реализоваться с Direct Dispatch. Соответственно, у данной структуры будут реализованы Direct Dispatch и Witness Table.
Диспетчеризация в Swift: погружение в теорию и практику
Да, совершенно верно, отредактировали статью.
Сравниваем готовые решения для реализации MVI-архитектуры на Android
Согласны, что простые решения на определённых проектах лучше. Например, Koin на небольших проектах гораздо легче чем Dagger. А иной раз достаточно и использования Service Locator. Исходя из нашего опыта, с ростом размера проекта и команды достоинства сложных решений перевешивают их недостатки.
Инструменты разработчика для тестирования Android-приложений
Добрый день. Подходы к тестированию могут быть разными в зависимости от команды и проекта. Например, разработчики зачастую пишут юнит-тесты на бизнес-логику для проверки различных граничных случаев, а QA и SDET занимаются более сложными кейсами, интеграционным тестированием и тестированием ui.
Работа с ML Kit в Android: как распознавать штрихкоды
Технологии под каждый проект выбираются с учетом всех его особенностей и требований заказчика. ML Kit разделен на пакеты, нет необходимости включать его в проект целиком. В данном случае для сканирования barcodes подключали только ML Kit barcode scanning.
Работа с ML Kit в Android: как распознавать штрихкоды
Да, это будет правильно, спасибо
Реализуем чистую архитектуру на Flutter с cubit
Мы выбрали этот способ для того, чтобы опираться на абстракцию, а не реализацию при продвижении от "глупых" сущностей (data) к "умным" (ui). Это соответствует составляющей D (dependency inversion) в принципе SOLID. Практическая цель - повышение тестируемости компонентов
Реализуем чистую архитектуру на Flutter с cubit
use_case может как получать, так и сохранять данные. Что касается описания интерфейса, предложенный вами способ тоже выглядит логичным, при этом в примере мы для удобства выбрали другой способ - держать абстракцию и реализацию рядом друг с другом.
Реализуем чистую архитектуру на Flutter с cubit
Как показано на последней схеме, use case находится между presenter и repository, внедрить use case в цепочку можно через инициализацию в presenter'е, такой способ реализован в примере.
Реализуем чистую архитектуру на Flutter с cubit
Согласны, архитектуру в флаттере можно рассмотреть на примере многих приложений, как простых, так и более сложных. Руководство при этом может превратиться в настоящую книгу) Однако, наша основная задача заключалась в том, чтобы познакомить новичков с реализацией чистой архитектуры на практике. А какие приложения выбрали бы вы?
Реализуем чистую архитектуру на Flutter с cubit
Можно вызывать emit сколько угодно раз, при вызове метода из кубита первым действием уведомить UI, вызвав emit(LoadingState()), загрузить данные из интернета, после emit(LoadedState()).
Flutter: открытие виджетов ключами
Предположим, что вам необходимо, чтобы на экране с TabBarView каждый таб мог переходить на новый роут. Для этого можно обернуть каждый элемент TabBarView в Navigator, что позволит переходить по роутам каждому табу, не затрагивая глобальный роут.
TabBarView будет выглядеть следующим образом:
Переход на другие роуты внутри таба будет происходить так же, как обычно
То, чего нам так не хватало: Render Effect в Android 12
Фоновая работа в Android: обзор возможностей WorkManager
Фоновая работа в Android: обзор возможностей WorkManager
Мобильное API, лайфхаки для MVP, микросервисы – в программе Hot Mobile&Backend в Санкт-Петербурге
Доклады начнутся в 11:00, каждый из них займет около 25 минут + 10 минут ответы на вопросы. В 13:30 будет кофе-брейк – около получаса, после этого – доклад-дискуссия. Доклады по мобильной разработке и Backend будут проходить в разных залах – «Библиотека» и Brandroom
Как реализовать таб-бар с нестандартной кнопкой: CAShapeLayer и UIResponderChain
Как реализовать таб-бар с нестандартной кнопкой: CAShapeLayer и UIResponderChain
Можно, конечно, ограничиться добавлением экшена для кнопки, но тогда не будет обрабатываться касание на выступающей вверх области кнопки.
Мы добавили в статью ссылку на проект на GitHub. Можно закомментировать переопределенный метод point(inside:with:) в классе CustomTabBar и проверить, как это будет работать без UIResponderChain