#ios #appstoreconnect
Обычно после статуса "Одобрено" идет "Готово к распространению".
Ошибка аппстора или им так понравилась сборка, что одобрили дважды? 😅
Обычно после статуса "Одобрено" идет "Готово к распространению".
Ошибка аппстора или им так понравилась сборка, что одобрили дважды? 😅
😁2👍1
#terminal #git #hint
Бывает, что после выполнения задачи ветку удаляют в репозитории, а локально она все еще висит. И когда таких веток набирается много, можно в них запутаться 😅
Чтобы удалить разом все такие ветки, нужно перейти в терминале в папку с проектом и выполнить команду:
Объяснение:
•
•
• Для каждой ветки проверяется, существует ли она на сервере (
• Если ветка отсутствует на сервере, она удаляется принудительно (
Перед выполнением команды нужно убедиться, что вы переключились на ветку, которую не хотите удалять (например,
Бывает, что после выполнения задачи ветку удаляют в репозитории, а локально она все еще висит. И когда таких веток набирается много, можно в них запутаться 😅
Чтобы удалить разом все такие ветки, нужно перейти в терминале в папку с проектом и выполнить команду:
git branch | grep -v "^\*" | while read branch; do
if ! git show-ref --verify --quiet refs/remotes/origin/$branch; then
git branch -D $branch
fi
done
Объяснение:
•
git branch выводит список всех локальных веток.•
grep -v "^\*" исключает текущую активную ветку (чтобы не удалять её).• Для каждой ветки проверяется, существует ли она на сервере (
refs/remotes/origin/branch).• Если ветка отсутствует на сервере, она удаляется принудительно (
git branch -D), что удалит ветку даже если в ней есть несмерженные изменения.Перед выполнением команды нужно убедиться, что вы переключились на ветку, которую не хотите удалять (например,
main или master).👌5❤1
#ios #swift #swiftui #binding #bug
Как сломать
Результат:
Как сломать
Xcode 16.3, чтобы в логах не было нормального описания ошибки:
import SwiftUI
struct BreakSwiftExample: View {
@State private var isOn = false
private var isOnBinding: Binding<Bool> {
.init(
get: { isOn },
set: changeToggle // не собирается
// set: { isOn = $0 } // собирается
)
}
var body: some View {
Toggle("Демо-тоггл", isOn: isOnBinding)
}
private func changeToggle(_ value: Bool) {
isOn = value
}
}
Результат:
Command SwiftCompile failed with a nonzero exit code❤2👍2🔥1
Как бы вы оценили свой опыт и понимание работы с Makefile в iOS-разработке?
Anonymous Poll
55%
Не доводилось слышать о Makefile, не знаю, что это такое
21%
Знаю (имею представление) об этом, но не приходилось использовать
13%
Доводилось иногда использовать, но знаний и опыта мало
9%
Уверенно использую для автоматизации несложных задач
2%
Владею темой на экспертном уровне, пишу сложные сценарии и оптимизирую процессы
#terminal #bundler #rbenv #hint
Кто читал предыдущую статью про использование
И после перезапуска терминала не работают команды
При этом если выполнять команды из
Вот что нужно сделать, чтобы эти настройки не сбрасывались.
1. Выполните в терминале по очереди эти две команды:
2. Затем примените изменения командой:
3. Всё! Теперь
Это безопасно:
-
- Добавление строк в
- Все ваши проекты будут использовать именно ту версию
Если захотите убрать эти настройки, просто откройте файл
После этого сохраните файл и выполните:
Всё вернётся как было 👌
Кто читал предыдущую статью про использование
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
Всё вернётся как было 👌
👌2❤1
Нужно переименовать сразу несколько файлов, а еще - изменить габариты сразу нескольких картинок (ширину/высоту). Сможешь сделать это без единой строчки кода на маке (и без терминала)?
Anonymous Poll
26%
Да
74%
Нет
❤1
easy_dev991
Нужно переименовать сразу несколько файлов, а еще - изменить габариты сразу нескольких картинок (ширину/высоту). Сможешь сделать это без единой строчки кода на маке (и без терминала)?
This media is not supported in your browser
VIEW IN TELEGRAM
#finder #macos #hint
Как изменить габариты сразу нескольких картинок (ширину/высоту) на
1. Выделяем нужные картинки
2. Открываем с помощью "Просмотр"
3. Выделяем все (
4. Инструменты -> Настроить размер
Как изменить габариты сразу нескольких картинок (ширину/высоту) на
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.
Решает задачу из опроса на изи)
Представляю вам 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))
}
Apple Developer Documentation
KeyPathComparator | Apple Developer Documentation
A comparator that uses another sort comparator to provide the comparison of values at a key path.
👍4🔥2
#ios #swift #swiftui #maps #geocoding #hint
На прошлой неделе заметил, что релиз 3.10 приложения с площадками стал сильно греть телефон, и даже в статистике аккумулятора спустя всего 10 минут использования мое приложение было первым в списке по потреблению энергии 🙈
В том релизе я сделал много классных штук, и в том числе немного обновил старый код для работы с картой, в результате нагрузка на девайс выросла в разы.
На днях выпустил релиз с исправлением этих проблем, и вот главные выводы:
1️⃣ Если нужно получить локацию пользователя с использованием CLLocationManager, то лучше не использовать startUpdatingLocation(), а просто вызывать requestLocation() по таймеру, например раз в 10 секунд - нагрузка ощутимо упадет
2️⃣ Использовать reverseGeocodeLocation нужно не чаще раза в минуту, а лучше еще реже - если координаты ощутимо изменились (на 50 метров, например), и это точно нужно для правильной работы фичи
3️⃣ Если используете MKMapView внутри
На прошлой неделе заметил, что релиз 3.10 приложения с площадками стал сильно греть телефон, и даже в статистике аккумулятора спустя всего 10 минут использования мое приложение было первым в списке по потреблению энергии 🙈
В том релизе я сделал много классных штук, и в том числе немного обновил старый код для работы с картой, в результате нагрузка на девайс выросла в разы.
На днях выпустил релиз с исправлением этих проблем, и вот главные выводы:
1️⃣ Если нужно получить локацию пользователя с использованием CLLocationManager, то лучше не использовать startUpdatingLocation(), а просто вызывать requestLocation() по таймеру, например раз в 10 секунд - нагрузка ощутимо упадет
2️⃣ Использовать reverseGeocodeLocation нужно не чаще раза в минуту, а лучше еще реже - если координаты ощутимо изменились (на 50 метров, например), и это точно нужно для правильной работы фичи
3️⃣ Если используете MKMapView внутри
SwiftUI-обертки, то напишите явную проверку в методе updateUIView, чтобы обновление карты выполнялось только тогда, когда это 100% нужно - я для этого сделал флаг shouldUpdateRegion и передаю его в карту, а в методе updateUIView вызываю замыкание при обновлении карты, чтобы снять флаг🔥5❤2
Как вам Cursor для iOS-разработки?
Anonymous Poll
57%
Не знаю, не проверяли
12%
Проверяли, не понравился
14%
Используем, не очень нравится, но совсем отказаться нельзя
18%
Используем, все нравится
❤4