easy_dev991 – Telegram
easy_dev991
628 subscribers
37 photos
21 videos
3 files
175 links
Делюсь интересными находками/лайфхаками в процессе разработки под iOS, и возможно ты найдешь что-то полезное для себя!

GitHub: https://github.com/easydev991
Download Telegram
#xcode #bug

В Xcode 16.3 для дебага приходилось нажимать esc при вводе названий свойств в консоли, чтобы увидеть подсказки.

Недавно вышла релизная версия Xcode 16.4, в которой этот баг поправили.
Ура! 🎉
🔥31
#terminal #bundler #rbenv #hint

Кто читал предыдущую статью про использование Makefile, и при этом впервые применил эти команды, скорее всего после перезапуска терминала столкнулся с ошибкой типа такой:

Could not find ‘bundler’ (2.6.5) required by your Gemfile.lock. (Gem::GemNotFoundException)


И после перезапуска терминала не работают команды bundle*, например: 

bundle exec fastlane


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

Вот что нужно сделать, чтобы эти настройки не сбрасывались.

1. Выполните в терминале по очереди эти две команды:

echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(rbenv init - zsh)"' >> ~/.zshrc


2. Затем примените изменения командой:

source ~/.zshrc


3. Всё! Теперь rbenv всегда будет работать автоматически, когда вы открываете терминал в папке проекта с файлом .ruby-version.

Это безопасно:
- rbenv специально разработан так, чтобы работать для каждого проекта отдельно, если в проекте есть файл .ruby-version
- Добавление строк в ~/.zshrc просто включает автоматическое переключение версий Ruby для каждого проекта, но не фиксирует какую-то одну версию Ruby глобально
- Все ваши проекты будут использовать именно ту версию Ruby, которая указана в их собственном .ruby-version.

Если захотите убрать эти настройки, просто откройте файл ~/.zshrc (например, командой nano ~/.zshrc или через Finder) и удалите строки:

export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init - zsh)"


После этого сохраните файл и выполните:

source ~/.zshrc


Всё вернётся как было 👌
👌21
#news #wwdc25

Обычно я не публикую новости с WWDC, но перед этим не устоял.

Обещают, что загрузка проектов будет до 40% быстрее в новой версии Xcode 😱

Конечно, можно придраться к слову "до", но все же.
И еще, Xcode будет весить на 24% меньше, и это тоже хорошо)

Видос с обзором всех новых штук тут.
🔥6
Нужно переименовать сразу несколько файлов, а еще - изменить габариты сразу нескольких картинок (ширину/высоту). Сможешь сделать это без единой строчки кода на маке (и без терминала)?
Anonymous Poll
26%
Да
74%
Нет
1
easy_dev991
Нужно переименовать сразу несколько файлов, а еще - изменить габариты сразу нескольких картинок (ширину/высоту). Сможешь сделать это без единой строчки кода на маке (и без терминала)?
This media is not supported in your browser
VIEW IN TELEGRAM
#finder #macos #hint

Как изменить габариты сразу нескольких картинок (ширину/высоту) на MacOS:
1. Выделяем нужные картинки
2. Открываем с помощью "Просмотр"
3. Выделяем все (command + A)
4. Инструменты -> Настроить размер
👍5🔥2😁1
struct ComplexModel {
let name: String
let id: Int
let price: Double
let isActive: Bool
let creationDate: Date
let websiteURL: URL?
let tags: [String]
let statistics: [String: Int]
let denoscription: String?
}

/// Выполнить работу с массивом и вернуть отсортированный массив
func doWork(with items: [ComplexModel]) -> [ComplexModel] {
// другая логика ...
return items.sorted(by: { $0.name < $1.name })
}
🫡2
easy_dev991
struct ComplexModel { let name: String let id: Int let price: Double let isActive: Bool let creationDate: Date let websiteURL: URL? let tags: [String] let statistics: [String: Int] let denoscription: String? } /// Выполнить…
Нужно сделать сортировку без замыкания и знаков "больше"/"меньше" стандартными средствами, не создавая никаких экстеншенов и кастомных методов
Anonymous Poll
21%
Знаю как это сделать
30%
Догадываюсь как сделать
49%
Не знаю как сделать
1👍1
easy_dev991
struct ComplexModel { let name: String let id: Int let price: Double let isActive: Bool let creationDate: Date let websiteURL: URL? let tags: [String] let statistics: [String: Int] let denoscription: String? } /// Выполнить…
#swift #foundation #keypath #hint

Представляю вам KeyPathComparator, доступный с iOS 15.
Решает задачу из опроса на изи)


struct ComplexModel {
let name: String
let id: Int
let price: Double
let isActive: Bool
let creationDate: Date
let websiteURL: URL?
let tags: [String]
let statistics: [String: Int]
let denoscription: String?
}

/// Выполнить работу с массивом и вернуть отсортированный массив
func doWork(with items: [ComplexModel]) -> [ComplexModel] {
// другая логика ...
return items.sorted(using: KeyPathComparator(\.name)) // <- вот
}

/// Выполнить работу с массивом и вернуть отсортированный массив
/// - Parameters:
/// - items: Изначальный массив
/// - order: Порядок сортировки
/// - Returns: Отсортированный массив
func doSortedWork(with items: [ComplexModel], order: SortOrder) -> [ComplexModel] {
// другая логика ...
return items.sorted(using: KeyPathComparator(\.name, order: order))
}
👍4🔥2
#ios #swift #swiftui #maps #geocoding #hint

На прошлой неделе заметил, что релиз 3.10 приложения с площадками стал сильно греть телефон, и даже в статистике аккумулятора спустя всего 10 минут использования мое приложение было первым в списке по потреблению энергии 🙈

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

На днях выпустил релиз с исправлением этих проблем, и вот главные выводы:

1️⃣ Если нужно получить локацию пользователя с использованием CLLocationManager, то лучше не использовать startUpdatingLocation(), а просто вызывать requestLocation() по таймеру, например раз в 10 секунд - нагрузка ощутимо упадет

2️⃣ Использовать reverseGeocodeLocation нужно не чаще раза в минуту, а лучше еще реже - если координаты ощутимо изменились (на 50 метров, например), и это точно нужно для правильной работы фичи

3️⃣ Если используете MKMapView внутри SwiftUI-обертки, то напишите явную проверку в методе updateUIView, чтобы обновление карты выполнялось только тогда, когда это 100% нужно - я для этого сделал флаг shouldUpdateRegion и передаю его в карту, а в методе updateUIView вызываю замыкание при обновлении карты, чтобы снять флаг
🔥52
easy_dev991
#ios #swift #swiftui #maps #geocoding #hint На прошлой неделе заметил, что релиз 3.10 приложения с площадками стал сильно греть телефон, и даже в статистике аккумулятора спустя всего 10 минут использования мое приложение было первым в списке по потреблению…
Любопытный момент: вот эти правки снизили потребление процессора почти до нуля во время работы приложения.

Я уже и не помню, почему вообще решил до этого сделать NetworkMonitorActor, хотя можно было использовать стандартный AsyncIterator 🙈

Зато в следующем релизе приложение будет потреблять минимум энергии ✔️
3