tgoop.com »
United States »
Библиотека мобильного разработчика | Android, iOS, Swift, Retrofit, Moshi, Chuck » Telegram Web
Android Developer — от 200 000 ₽, гибрид (Санкт-Петербург)
Senior iOS Developer (Swift, SwiftUI, UIKit, CloudKit, APN, Network Extension) — от 500 000 ₽ , удалёнка
Kotlin/Java Developer (JetBrains Platform) — от 300 000 до 370 000 ₽, удалёнка
Senior Flutter-разработчик — от 4 000 до 7 000 $, удалёнка
iOS разработчик — удалёнка
#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1👍1
В Clean Swift приложение состоит из сцен, т.е. каждый экран приложения — это одна сцена. Основное взаимодействие в сцене идет через последовательный цикл между компонентами ViewController -> Interactor -> Presenter. Это называется VIP цикл.
Мостом между компонентами выступает файл Models, который хранит в себе передаваемые данные. Так же есть Router, отвечающий за переход и передачу данных между сценами, и Worker, который берет часть логики Interactor’a на себя.
🔹 View
Storyboard’ы, XIB’ы или UI элементы, написанные через код.
🔹 ViewController
Отвечает только за конфигурацию и взаимодействие с View. В контроллере не должно находиться никакой бизнес логики, взаимодействия с сетью, вычислений и так далее.
Его задача обрабатывать события с View, отображать или отправлять данные (без обработки и проверок) в Interactor.
🔹 Interactor
Содержит в себе бизнес логику сцены.
Он работает с сетью, базой данных и модулями устройства.
Interactor получает запрос из ViewController’a (с данными или пустой), обрабатывает его и, если это требуется, передает новые данные в Presenter.
🔹 Presenter
Занимается подготовкой данных для отображения.
Как пример, добавить маску на номер телефона или сделать первую букву в названии заглавной.
Обрабатывает данные, получение из Interactor’a, после чего отправляет их обратно во ViewController.
🔹 Models
Набор структур для передачи данных между компонентами VIP цикла. Каждый круг цикла имеет в себе 3 вида структур:
🔹 Worker
Разгружает Interactor, забирая на себя часть бизнес логики приложения, если Interactor стремительно разрастается.
Так же можно создавать общие для всех сцен Worker’ы, если их функционал используется в нескольких сценах.
Как пример, в Worker можно выносить логику работы с сетью или базой данных.
🔹 Router
В Router выносится вся логика, отвечающая за переходы и передачу данных между сценами.
____________________
Для прояснения картины работы VIP цикла приведу стандартный пример — авторизация.
1. Пользователь ввел свой логин и пароль, нажал на кнопку авторизации
2. У ViewController срабатывает IBAction, после чего создается структура с введенными, в TextField’ы, данными пользователя (Models -> Request)
3. Созданная структура передается в метод fetchUser в Interactor’e
4. Interactor отправляет запрос в сеть и получает ответ об успешности авторизации
5. На основе полученных данных, создает структуру с результатом (Models -> Response) и передается в метод presentUser в Presenter’e
6. Presenter форматирует данные по необходимости и возвращает их (Models -> ViewModel) в метод displayUser в ViewController’e
7. ViewController отображает полученные данные пользователю. В случае с авторизацией, может выводиться ошибка или срабатывать переход на другую сцену с помощью Router
Таким образом, мы получаем единую и последовательную структуру, с распределением обязанностей на компоненты.
#АрхитектурныйКод #SeniorView #Swift
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3
Please open Telegram to view this post
VIEW IN TELEGRAM
😁9
KMP Starter — современный, готовый к использованию шаблон приложения на Kotlin Multiplatform с дизайном Material 3, утилитами и чистой архитектурой.
Технический стек: Kotlin Multiplatform для кроссплатформенной разработки, Compose Multiplatform для UI, Material 3 как дизайн-система, Koin для инъекции зависимостей, Room в качестве локальной базы данных, DataStore для хранения настроек, корутины и Flow для асинхронного программирования, RevenueCat для покупок, MixPanel для аналитики, Kotlinx Serialization для сериализации JSON.
#буст #Android
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
В карточках рассказали, как устроены эти системы, какие из них используют российские и зарубежные IT-компании, и главное — как адаптировать резюме, чтобы робот тебя пропустил.
#MadeInProglib
Please open Telegram to view this post
VIEW IN TELEGRAM
VK Звонки способны работать даже в условиях высокой потери пакетов и низкой пропускной способности сети. Хотя интернет в крупных городах стал быстрым и стабильным, поездки в метро, использование лифта или подключение к Wi-Fi в кафе по-прежнему создают проблемы с качеством связи.
Спикеры рассказали, как решили эту задачу на Android-клиенте и какие техники для аудио и соединения можно применить в вашем проекте для звонков.
Доклад будет полезен всем, кто хочет узнать о передаче медиа в реальном времени в сложных сетевых условиях.
#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
😁4👾1
adb shell dumpsys meminfo – детальный анализ использования памяти приложениемМощный инструмент для мониторинга использования памяти вашим приложением в реальном времени. Помогает находить утечки памяти и оптимизировать потребление RAM.
1. PSS (Proportional Set Size):
• Реальная память, занимаемая приложением
• Включает разделяемую память (пропорционально)
2. Private Dirty:
• Память, принадлежащая только вашему приложению
• Не может быть выгружена в swap
3. Java Heap:
• Память, управляемая Dalvik/ART
• Ключевой показатель для поиска утечек
Мониторинг в реальном времени:
# Каждые 2 секунды обновлять информацию
watch -n 2 "adb shell dumpsys meminfo com.yourapp.package"
Сравнение состояний:
# До и после выполнения операции
adb shell dumpsys meminfo com.yourapp.package > before.txt
# Выполняем действия в приложении
adb shell dumpsys meminfo com.yourapp.package > after.txt
diff before.txt after.txt
Поиск утечек в Activity:
# Проверить, не остались ли Activity в памяти
adb shell dumpsys meminfo | grep -E "Activity|View|Context"
Только Java Heap:
adb shell dumpsys meminfo com.yourapp.package | grep -A 10 "Java Heap"
Нативные allocations:
adb shell dumpsys meminfo com.yourapp.package | grep -A 5 "Native Heap"
Applications Memory Usage (in KB)
Uptime: 1234567 Realtime: 1234567
** MEMINFO in pid 1234 [com.yourapp] **
Pss Private Private SwapPss Heap Heap Heap
Total Dirty Clean Dirty Size Alloc Free
------ ------ ------ ------ ------ ------ ------
Native Heap 12345 12000 345 100 15000 14000 1000
Dalvik Heap 5678 5600 78 50 6000 5800 200
🔧 Продвинутое использование:
Профилирование конкретной операции:
#!/bin/bash
echo "Память до:" > mem_log.txt
adb shell dumpsys meminfo com.yourapp.package >> mem_log.txt
# Запускаем тестовый сценарий
adb shell am start -n com.yourapp/.TestActivity
echo "Память после:" >> mem_log.txt
adb shell dumpsys meminfo com.yourapp.package >> mem_log.txt
Pro-совет: Используйте с procstats для долгосрочного мониторинга:
bash
adb shell dumpsys procstats --hours 1 com.yourapp.package
Как вы отслеживаете использование памяти в своих приложениях?
#буст #MiddlePath #Android
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
Please open Telegram to view this post
VIEW IN TELEGRAM
Почему счетчик лайков увеличивается неправильно при быстром нажатии?
Anonymous Quiz
32%
Кнопка не блокируется во время анимации
10%
Неправильная работа с состоянием likeCount
34%
Отсутствие debounce для быстрых нажатий
4%
Проблема с анимацией transform
19%
Посмотреть ответ
Меню в SwiftUI часто используются для быстрых одноразовых команд: выберите пункт, выполните действие — и всё готово. Но что, если вы хотите, чтобы меню функционировало не как простой селектор, а как мини-панель настроек, где пользователи могут последовательно переключать несколько пунктов, прежде чем сделать окончательный выбор? По умолчанию меню закрывается, как только пользователь нажимает на пункт, но с помощью подходящего API это поведение можно изменить.
Обычно при добавлении Menu к метке — например, к значку с тремя точками или кнопке — каждое касание внутри меню выполняет действие и немедленно закрывает меню. Это ожидаемый рабочий процесс «выбрать и закрыть».
Но есть сценарии, в которых может быть предпочтительнее другая модель взаимодействия:
В таких случаях поведение закрытия по умолчанию не является идеальным.
SwiftUI расширяет меню с помощью модификатора
menuActionDismissBehavior(_:). Это даёт вам возможность точно контролировать, должно ли касание внутри меню приводить к его закрытию или оставаться открытым.Модификатор принимает один параметр типа
MenuActionDismissBehavior, который представляет собой перечисление, определяемое примерно следующим образом:public enum MenuActionDismissBehavior {
case automatic // system-default behaviour
case enabled // explicitly force dismissal on each tap
case disabled // keep the menu open after taps
}Применение модификатора выглядит так:
Menu("Options") {
Button("Toggle A") { /* … */ }
Button("Toggle B") { /* … */ }
Divider()
Button("Done") { /* … */ }
}
.menuActionDismissBehavior(.disabled)При использовании
.disabled меню остаётся открытым после каждого действия, позволяя пользователю выполнить несколько действий, прежде чем решить закрыть его.Представьте, что у вас есть набор функций, которые пользователь может включить или отключить, и вы хотите, чтобы пользователь мог сделать несколько выборов в меню, прежде чем закрыть его.
struct FeatureToggleMenu: View {
@State private var featureA = false
@State private var featureB = false
@State private var featureC = false
var body: some View {
Menu {
Section {
Toggle("Feature A", isOn: $featureA)
Toggle("Feature B", isOn: $featureB)
Toggle("Feature C", isOn: $featureC)
}
.menuActionDismissBehavior(.disabled)
Button("Apply Changes") {
// commit logic here
}
} label: {
Label("Settings", systemImage: "gearshape")
}
}
}В этом макете:
Модификатор
menuActionDismissBehavior(_:) — это удобный API для преобразования типичных меню SwiftUI в более надежные мини-интерфейсы для настроек, переключателей и многошаговых рабочих процессов. Продуманное использование этого может привести к более понятному и интуитивно понятному пользовательскому интерфейсу, когда вам нужно больше, чем простое взаимодействие «выбрать и применить».#буст #MiddlePath #Swift
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1😁1
🎁 И мозг прокачать, и макбук утащить!
Proglib.academy разыгрывает MacBook Pro 14 (M3 Pro, 36 GB, 1 TB SSD) 💻
Условия:
1️⃣ Покупаешь любой курс Proglib до 15 ноября.
2️⃣ Проходишь минимум 2 учебные недели (можно осилить за два вечера).
3️⃣ Пишешь куратору в чат своего курса: #розыгрыш.
Что за курсы?
— Математика для Data Science (6 месяцев боли и просветления).
— Основы Python, ML, алгоритмы, AI-агенты и даже курс для тех, кто в IT, но не кодит.
👉 Участвовать в розыгрыше
Proglib.academy разыгрывает MacBook Pro 14 (M3 Pro, 36 GB, 1 TB SSD) 💻
Условия:
1️⃣ Покупаешь любой курс Proglib до 15 ноября.
2️⃣ Проходишь минимум 2 учебные недели (можно осилить за два вечера).
3️⃣ Пишешь куратору в чат своего курса: #розыгрыш.
Что за курсы?
— Математика для Data Science (6 месяцев боли и просветления).
— Основы Python, ML, алгоритмы, AI-агенты и даже курс для тех, кто в IT, но не кодит.
👉 Участвовать в розыгрыше
Please open Telegram to view this post
VIEW IN TELEGRAM
😁5
Please open Telegram to view this post
VIEW IN TELEGRAM
Что выведет код?
Anonymous Quiz
5%
Final count: 0
32%
Final count: меньше 1000 (случайное число)
55%
Final count: 1000
8%
Ошибка компиляции
Please open Telegram to view this post
VIEW IN TELEGRAM
😁2
