tgoop.com »
United States »
Библиотека мобильного разработчика | Android, iOS, Swift, Retrofit, Moshi, Chuck » Telegram Web
This media is not supported in your browser
VIEW IN TELEGRAM
В proglib.academy — Глобальная распродажа знаний ‼️
💥 Весь октябрь –40% на те курсы, которые выбирают чаще всего.
👉 Успей забрать свой курс на proglib.academy
💥 Весь октябрь –40% на те курсы, которые выбирают чаще всего.
Курсы с практикой, без воды и пафоса.
Просто берёшь и делаешь апгрейд.
👉 Успей забрать свой курс на proglib.academy
😁1
Когда несколько корутин обращаются к общим данным или ресурсам одновременно, возникает риск гонок данных (race conditions).
Mutex (mutual exclusion) — это инструмент синхронизации, который помогает управлять доступом к общим ресурсам, гарантируя, что в один момент времени их изменяет только одна корутина.
Вот самые частые примеры, когда Mutex действительно нужен:
Самый распространённый случай — безопасный доступ к общей переменной:
class CounterService {
private var counter = 0
private val mutex = Mutex()
suspend fun increment() {
mutex.withLock {
counter++
}
}
suspend fun getCount(): Int {
return mutex.withLock {
counter
}
}
}
Когда несколько корутин должны поочерёдно работать с общим ресурсом:
class FileWriter(private val file: File) {
private val mutex = Mutex()
suspend fun appendLine(line: String) {
mutex.withLock {
file.appendText("$line\n")
}
}
}
Когда операции должны выполняться строго по порядку, даже если запущены одновременно:
class OrderProcessor {
private val mutex = Mutex()
private val orders = mutableListOf<Order>()
suspend fun processOrder(order: Order) {
mutex.withLock {
// Обеспечиваем последовательную обработку заказов
orders.add(order)
validateOrder(order)
persistOrder(order)
}
}
}
Обеспечивает безопасную инициализацию ресурса в асинхронных контекстах:
class DatabaseConnection {
private var connection: Connection? = null
private val mutex = Mutex()
suspend fun getConnection(): Connection {
if (connection != null) return connection!!
return mutex.withLock {
// Повторная проверка внутри блокировки
connection ?: createConnection().also { connection = it }
}
}
private suspend fun createConnection(): Connection {
delay(1000) // Симуляция установки соединения
return Connection()
}
}
#АрхитектурныйКод #JuniorKit #Kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤1
🤯 Из Figma в UI-код с помощью LLM: путь боли и прозрений
Даже с крутым DSL и дизайн-системой переносить макеты из Figma в код можно часами. В какой-то момент ребята из Яндекс Go порядком от этого устали и решили научить LLM делать вёрстку за них.
Они попробовали всё: от скармливания сырого JSON и возни с Agent IDE до постройки сложного RAG-конвейера с автопроверкой компилятором.
В итоге пришли к элегантному решению: LLM генерирует не Kotlin, а простое описание UI на YAML. А специальный транслятор уже без ошибок превращает его в 100% рабочий код.
В статье — весь путь с инсайтами и рассказом о том, как реально применить LLM в мобильной разработке.
Даже с крутым DSL и дизайн-системой переносить макеты из Figma в код можно часами. В какой-то момент ребята из Яндекс Go порядком от этого устали и решили научить LLM делать вёрстку за них.
Они попробовали всё: от скармливания сырого JSON и возни с Agent IDE до постройки сложного RAG-конвейера с автопроверкой компилятором.
В итоге пришли к элегантному решению: LLM генерирует не Kotlin, а простое описание UI на YAML. А специальный транслятор уже без ошибок превращает его в 100% рабочий код.
В статье — весь путь с инсайтами и рассказом о том, как реально применить LLM в мобильной разработке.
Каждый мобильщик знает этот момент: проект собран, пора тестить. И вот тут начинается священная война.
Одни запускают на эмуляторе — быстро, удобно, без лишних проводов. Другие достают свой старенький Pixel или iPhone SE, потому что «только на реальном девайсе видно настоящие лаги».
А вы на чьей стороне?
❤️ — эмулятор
👍 — реальное устройство
#междусобойчик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21❤7
Senior Android-разработчик в Маркетплейс — удалёнка
Flutter-разработчик — от 250 000 ₽, гибрид (Москва)
Senior IOS-разработчик — от 350 000 ₽, удалёнка
Team Lead Backend Developer — от 350 000 ₽, удалёнка
Team Lead Mobile Developer (Flutter) — от 5 500 до 7 000 $, удалёнка
#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
NavigationPath
NavigationStack
и NavigationPath
в SwiftUI предоставляют мощный и гибкий способ выполнять программную навигацию в приложении. Когда вы управляете навигацией, часто возникает необходимость программно открывать (push) и закрывать (pop) экраны. NavigationPath
позволяет делать это, сохраняя типобезопасность и гибкость.🔹
NavigationStack(root:)
Инициализатор по умолчанию задаёт корень навигационной иерархии и управляет путём навигации “за кулисами”. Если вы хотите получить больший контроль и управлять навигацией программно, можно хранить путь в переменной
@State
и передавать его в инициализатор NavigationStack(path:root:)
.Параметр path должен быть
Binding<Data>
, и есть два способа его использования.Первый способ — использовать массив определённого типа, который реализует протокол
Hashable
. Это удобно, если весь стек навигации основан на одном типе данных.@State private var path: [Color] = []
NavigationStack(path: $path) {
List {
ForEach(colors, id: \.self) { color in
Button {
path.append(color)
} label: {
...
}
}
}
.navigationDestination(for: Color.self) { color in
VStack {
color
...
Button("Pop to root") {
path.removeAll()
}
}
...
}
}
В примере выше навигационный стек поддерживается массивом объектов
Color
, который выступает в роли NavigationPath
. Каждый раз, когда элемент добавляется в path, модификатор navigationDestination(for:)
показывает соответствующий экран. Вызов path.removeAll()
очищает стек и возвращает пользователя к корневому экрану.Этот подход идеально подходит для чистой, типобезопасной навигации с минимальной настройкой, особенно если вы работаете с одним типом данных.
Когда вы находитесь в корневом экране, массив пуст.
При переходе вперёд — он заполняется элементами, где последний элемент массива соответствует текущему экрану.
Чтобы открыть новый экран — добавляем элемент, чтобы вернуться назад — удаляем последний.
NavigationPath
для нескольких типовЕсли навигационный стек может содержать разные типы данных (например,
Color
, String
или пользовательские типы), лучше использовать NavigationPath
. Он работает как type-erased список данных, но при этом сохраняет достаточно информации, чтобы SwiftUI знал, какой экран показать для каждого типа.@State private var path = NavigationPath()
NavigationStack(path: $path) {
List {
Section("Colors") {
ForEach(colors, id: \.self) { color in
Button {
path.append(color)
} label: {
...
}
}
}
Section("Genres") {
ForEach(genres, id: \.self) { genre in
Button {
path.append(genre)
} label: {
...
}
}
}
}
.navigationDestination(for: Color.self) { color in
VStack {
...
Button("Pop to root") {
path.removeLast(path.count)
}
}
...
}
.navigationDestination(for: String.self) { genre in
VStack {
...
Button("Pop to root") {
path.removeLast(path.count)
}
}
...
}
}
С
NavigationPath
вы можете добавлять разные типы данных в стек. Для каждого типа нужно задать отдельный navigationDestination(for:destination:)
, чтобы описать, как отображать соответствующий экран.Если вы добавите значение в
NavigationPath
, но не определите navigationDestination
для его типа,ошибки компиляции не будет — однако пользователь увидит пустой экран с предупреждением.
Такой подход более гибкий, особенно для приложений, навигация в которых зависит от различных моделей данных.
#PixelPerfect #MiddlePath #SwiftUI
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Please open Telegram to view this post
VIEW IN TELEGRAM
😁9💯2
🤓 Пока Python стал π-thon, ты можешь стать Data Scientist'ом
В Proglib.academy стартует экспресс-курс «Математика для Data Science»: 10 живых вебинаров, практика на Python и спикеры из ВШЭ, Яндекс Практикума и Wildberries, которые всё разложат по полочкам.
В программе:
🔹 матан, линал, теория вероятностей;
🔹 3 практических проекта + викторина с розыгрышем TG Premium;
🔹 поддержка преподавателей и чат с единомышленниками;
🎁 Оплати курс до 19 октября — получи курс по базовой математике в подарок.
🗓️ Старт — 6 ноября
👉 Записаться на курс
В Proglib.academy стартует экспресс-курс «Математика для Data Science»: 10 живых вебинаров, практика на Python и спикеры из ВШЭ, Яндекс Практикума и Wildberries, которые всё разложат по полочкам.
В программе:
🔹 матан, линал, теория вероятностей;
🔹 3 практических проекта + викторина с розыгрышем TG Premium;
🔹 поддержка преподавателей и чат с единомышленниками;
🎁 Оплати курс до 19 октября — получи курс по базовой математике в подарок.
🗓️ Старт — 6 ноября
👉 Записаться на курс
Аналогично
Object
в Java, к чему можно привести любой тип в Kotlin?Правильным ответом будет
Any?
.Сам по себе класс Any это почти аналог
Object
, однако, благодаря поддержке nullable и не-nullable типов в Kotlin мы получили Any?
. Фактически, Any?
соответствует любому типу и null
, а Any
только любому типу.Если по порядку:
1.
Any
является корнем иерархии не-nullable типов.2.
Any?
является корнем иерархии nullable типов.3. Так как
Any?
является супертипом Any
, то Any?
находится в самом верху иерархии типов в Kotlin.#буст #JuniorKit #Android
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍2🔥2
📄 Неочевидные ошибки в резюме айтишника, которые убивают отклики
В карточках разобрали неочевидные ошибки айтишников при составлении резюме.
👉 Читать статью
🐸 Библиотека мобильного разработчика
#MadeInProglib
В карточках разобрали неочевидные ошибки айтишников при составлении резюме.
#MadeInProglib
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2