Telegram Web
⚙️ SQLiteData — быстрая и легкая замена SwiftData с SQL и CloudKit

SQLiteData — это быстрая и лёгкая замена SwiftData от Point-Free, включающая SQL и синхронизацию с CloudKit (и даже шаринг CloudKit), построенная на основе популярной библиотеки GRDB.

Пример:

@FetchAll
var items: [Item]

@Table
struct Item {
let id: UUID
var title = ""
var isInStock = true
var notes = ""
}


Этот пример извлекают элементы из внешнего хранилища данных с использованием типов данных Swift, и автоматически отслеживается SwiftUI, поэтому представления пересчитываются при изменении внешних данных. При этом SQLiteData работает непосредственно с SQLite и может использоваться откуда угодно, включая UIKit, модели @Observable и многое другое.

💻 SQLiteData на GitHub

🐸 Библиотека мобильного разработчика

#буст #iOS
Please open Telegram to view this post
VIEW IN TELEGRAM
3
📄🚫 5 неочевидных ошибок в резюме айтишника, которые убивают отклики

Резюме вроде нормальное, скиллы есть, а отклики уходят в пустоту? Проблема не в вас, а в том, как вы упаковываете свой опыт. Разбираем неочевидные ошибки айтишников при составлении резюме.

👉 Читать статью

🐸 Библиотека мобильного разработчика

#MadeInProglib
Please open Telegram to view this post
VIEW IN TELEGRAM
2
💥 Весь октябрь -40% на курсы для разработчиков в proglib.academy

Бери знания под свой стек:
Python | алгоритмы | математика для Data Science | архитектура кода.

Пока одни ждут «идеальный момент», другие просто учатся.
А потом берут ваши офферы.


⚡️ Пока скидка действует, апдейтни свои навыки
👾 Погружаемся в недра Retrofit

Думаю, многие задумывались о том, что происходит с функциями в интерфейсе Retrofit сервиса, когда мы помечаем их ключевым словом suspend? У некоторых даже есть заблуждение, что для сетевых запросов в таком случае используется корутиновский Dispatchers.IO. Спойлер — это не совсем так.

➡️ В этой статье автор как раз разберёт, как всё работает на самом деле

🐸 Библиотека мобильного разработчика

#свежак #Android
Please open Telegram to view this post
VIEW IN TELEGRAM
4
📌 Что такое OptionSet

OptionSet — это протокол, который представляет параметры в виде битов (битовой маски). Он также предоставляет вашему типу операции, подобные операциям с множествами, такие как объединение и пересечение. OptionSet позволяет объединять несколько значений.

Это отличное решение, если вам нужно предоставить какие-то параметры, настройки, разрешения, стили и т. д.

Давайте напишем код:

struct TasksListOptions: OptionSet {
let rawValue: Int

static let showFilter = TasksListOptions(rawValue: 1 << 0)
static let showSearch = TasksListOptions(rawValue: 1 << 1)
static let showSort = TasksListOptions(rawValue: 1 << 2)
static let showLayoutSelector = TasksListOptions(rawValue: 1 << 3)
}


Каждый вариант rawValue представляет собой один бит в одном и том же целом числе: 1 << 0 — это  0001, 1 << 1 — это  0010, 1 << 2 — это  0100 и так далее. При объединении вариантов Swift объединяет их биты с помощью оператора побитового ИЛИ (|), поэтому showFilter + showSort становится 0101. Таким образом, несколько вариантов объединяются в одно компактное число, в котором каждый бит чётко обозначает отдельный вариант.

Как уже упоминалось, замечательной особенностью OptionSet является возможность комбинировать параметры. Один из распространённых сценариев — объявление предустановок по умолчанию с комбинированными значениями. Например, можно создать all параметр для представления всех параметров. В нашем примере мы можем создать предустановки для разных типов списков:

struct TasksListOptions: OptionSet {
...

static let today: TasksListOptions = [.showFilter, .showSearch]
static let allTasks: TasksListOptions = [.showFilter, .showSearch, .showSort, .showLayoutSelector]
}


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

@Observable
final class TasksListViewModel {
private let options: TasksListOptions
}


🐸 Библиотека мобильного разработчика

#буст #MiddlePath #iOS
Please open Telegram to view this post
VIEW IN TELEGRAM
3
🗂 Derived Data: 5 ошибок iOS-разработчиков

Папка Derived Data (производные данные) — один из важнейших каталогов, используемых iOS-разработчиком. Хотя вы не работаете с ней напрямую, Xcode активно использует её для кэширования информации и оптимизации разработки.

Тем не менее, у iOS-разработчиков есть множество возможностей максимально эффективно использовать Derived Data. Будь то удаление файлов для оптимизации сборки или просмотр информации о каталоге, все эти действия могут улучшить работу разработчиков.

➡️ В статье автор рассмотрит 5 ошибок, которые совершают iOS-разработчики

🐸 Библиотека мобильного разработчика

#свежак #iOS
Please open Telegram to view this post
VIEW IN TELEGRAM
3
🚀 adb shell pm clearмгновенный сброс данных приложения без переустановки

Мгновенно очищает все данные и кэш приложения, возвращая его в состояние "только что установленного". Идеально для тестирования сценариев первого запуска.

📌 Когда это особенно полезно:

1. Тестирование первого запуска:

adb shell pm clear com.yourapp.package && adb shell am start -n com.yourapp.package/.MainActivity


2. Сброс авторизации:

Больше не нужно удалять/переустанавливать приложение чтобы проверить сценарий логина заново.

3. Очистка перед демо:


Убедитесь, что приложение покажет именно то, что вы планировали на демонстрации.

⚡️ Комбинированные сценарии:

Сброс + запуск:

adb shell pm clear com.yourapp.package && sleep 2 && adb shell am start -n com.yourapp.package/.MainActivity


Сброс нескольких приложений:

for app in com.app1 com.app2 com.app3; do
adb shell pm clear $app
done


⚙️ Особенности:

• Сохраняет APK – не переустанавливает приложение
• Быстрее удаления – экономит время на тестах
• Работает на всех устройствах – включая production-сборки

Как часто вы сбрасываете данные при тестировании? 🧹

🐸 Библиотека мобильного разработчика

#буст #AllLevels #Android
Please open Telegram to view this post
VIEW IN TELEGRAM
5
👀 Баг или фича

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

Теперь разбираемся, это недоработка или новая фича, мотивирующая авторизацию 🤔

🐸 Библиотека мобильного разработчика
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🗑 «Пишу чистый код» и еще 50 фраз, из-за которых ваше резюме летит в корзину

Рекрутеры видят одно и то же в каждом втором резюме: «командный игрок», «работаю с современными технологиями», «обладаю аналитическим складом ума». Эти клише не просто скучны — они ставят под сомнение вашу компетентность.

Разбираем 50+ шаблонных фраз по всем IT-направлениям и показываем, как их заменить или вообще выкинуть.

👉 Читать статью

🐸 Библиотека мобильного разработчика

#MadeInProglib
Please open Telegram to view this post
VIEW IN TELEGRAM
2😢2
🗓 Новости недели

Приготовили для вас дайджест по актуальному из мира iOS, Android и кроссплатформы.

🔵 Делаем анимацию отрисовки для SF Symbols в SwiftUI

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

🔵Всё о функциях Swift Package Manager

Узнайте, как трейты работают в качестве флагов функций, обеспечивая условную компиляцию, необязательные зависимости и расширенные конфигурации пакетов.

🔵 Почему моё Android-приложение крашится?

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

🔵 Что такое SupervisorJob в корутинах Kotlin

Из этой статьи вы узнаете, что такое SupervisorJob, как он работает и какие реальные примеры использования есть в viewModelScope и RevenueCat SDK.

🔵 Flutter Web глазами мобильного разработчика

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

🐸 Библиотека мобильного разработчика

#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
3
🤡 Побочные эффекты в Jetpack Compose — простое объяснение

В Jetpack Compose не рекомендуется напрямую вызывать не-компонуемые функции внутри composable-функций.

Вместо этого, чтобы безопасно выполнять операции вроде запуска корутин, вызова побочных эффектов или обработки логики, зависящей от жизненного цикла, используются обработчики эффектов (effect handlers).

Эти обработчики позволяют безопасно взаимодействовать с внешним миром (сеть, база данных, логи и т. д.) в контролируемом виде.

Ниже приведены самые распространённые обработчики эффектов в Compose — просто и с примерами.

🔹 SideEffect

Выполняет логику после каждого успешного пересоздания (recomposition).

SideEffect {
Log.d("TAG", "Recomposition completed")
}


Подходит для логирования, аналитики или любых операций, которые должны выполняться после отрисовки интерфейса.

🔹 LaunchedEffect

Запускает корутину, когда изменяется указанный ключ. Если происходит пересоздание и ключ меняется — предыдущая корутина отменяется, и запускается новая.

LaunchedEffect(key1 = someState) {
fetchData()
}


Идеально подходит для вызова API или выполнения логики, зависящей от изменяющегося состояния.

🔹 rememberCoroutineScope

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

val coroutineScope = rememberCoroutineScope()
Button(onClick = {
coroutineScope.launch {
doSomething()
}
}) {
Text("Click me")
}


Для событий, инициируемых пользователем, которые не зависят напрямую от состояния или жизненного цикла.

🔹 DisposableEffect

Выполняет код при входе в композицию и очищает ресурсы при выходе из неё.

DisposableEffect(key1 = someKey) {
startListening()


    onDispose {
stopListening()
}
}


Добавление или удаление слушателей, наблюдателей, освобождение внешних ресурсов и другая логика очистки.

🐸 Библиотека мобильного разработчика

#буст #JuniorKit #Android
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
This media is not supported in your browser
VIEW IN TELEGRAM
В proglib.academy — Глобальная распродажа знаний ‼️

💥 Весь октябрь –40% на те курсы, которые выбирают чаще всего.

Курсы с практикой, без воды и пафоса.
Просто берёшь и делаешь апгрейд.


👉 Успей забрать свой курс на proglib.academy
😁1
🔒 Основные сценарии использования Mutex в Kotlin

Когда несколько корутин обращаются к общим данным или ресурсам одновременно, возникает риск гонок данных (race conditions).

Mutex (mutual exclusion) — это инструмент синхронизации, который помогает управлять доступом к общим ресурсам, гарантируя, что в один момент времени их изменяет только одна корутина.

Вот самые частые примеры, когда Mutex действительно нужен:

1️⃣ Защита разделяемого изменяемого состояния

Самый распространённый случай — безопасный доступ к общей переменной:

class CounterService {
private var counter = 0
private val mutex = Mutex()

suspend fun increment() {
mutex.withLock {
counter++
}
}

suspend fun getCount(): Int {
return mutex.withLock {
counter
}
}
}


2️⃣ Координация доступа к ресурсу

Когда несколько корутин должны поочерёдно работать с общим ресурсом:

class FileWriter(private val file: File) {
private val mutex = Mutex()

suspend fun appendLine(line: String) {
mutex.withLock {
file.appendText("$line\n")
}
}
}


3️⃣ Обеспечение последовательного выполнения

Когда операции должны выполняться строго по порядку, даже если запущены одновременно:

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)
}
}
}


4️⃣ Отложенная инициализация с защитой потоков

Обеспечивает безопасную инициализацию ресурса в асинхронных контекстах:

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
👍51
📱 Эмулятор vs реальное устройство

Каждый мобильщик знает этот момент: проект собран, пора тестить. И вот тут начинается священная война.

Одни запускают на эмуляторе — быстро, удобно, без лишних проводов. Другие достают свой старенький Pixel или iPhone SE, потому что «только на реальном девайсе видно настоящие лаги».

А вы на чьей стороне? 💬

❤️ — эмулятор
👍 
реальное устройство

🐸 Библиотека мобильного разработчика 

#междусобойчик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍227
2025/10/24 16:54:19
Back to Top
HTML Embed Code: