В сентябре мы немного переключимся от Swift Concurrency к AI агентам и llm-кам. Но потом вернемся, чтобы лучше структурировать контент. Пока буду делать новую рубрику Swift Concurrency Tips. Начнем с самого популярного.
Многие думают, что вызов Task.cancel() моментально останавливает выполнение. Но это не так: таска лишь помечается как отмененная, а продолжит работать, пока сама не проверит свой статус.
Таска сама должна проверить свой статус и для этого у нас есть:
Вывод: Swift сам вашу задачу не остановит — добавляйте проверки.
Полезные ссылки:
- How to cancel a Task
- Task Cancellation in Swift Concurrency
- How does Task.checkCancellation knows task?
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Мифы разработки и Reference Promotion
Есть тема управления памятью и в ней много заблуждений. Часто это связанно с формулировками и дефинициями. А также, что многое нельзя проверить практикой.
Например, один из вопросов для споров: "когда value type хранится в куче?". Этот вопрос далеко не всегда практический, но часто его задают, чтобы оценить эрудицию и начитанность кандидата статьями. Это неплохая оценка, ведь показывает насколько глубоко любит копать кандидат чисто на интересе. Его задали сегодня в нашем чате.
Тут обычно вспоминают Boxing.
Когда происходит Boxing? (Вспоминая великий фильм Seven хочется пошутить What's in the box????). Компилятор прибегает к этому в нескольких случаях:
- когда value type нужно хранить в Any или протоколе
- когда переменную захватывает замыкание и она должна пережить стековый фрейм
- внутри инициализаторов структур, чтобы мутировать self, пока он ещё не до конца сконструирован
Одно из заблуждений, которое встречал на собесах, это ожидаемый ответ "когда структура хранит в себе классы". Но это не совсем правда.
В "куче" структура только "бывает" при инициализации. После выхода из инициализатора box уничтожается, и структура может снова жить как value.
В итоге, как правильно отвечать на вопрос "живет ли структура в куче"?
Есть тема управления памятью и в ней много заблуждений. Часто это связанно с формулировками и дефинициями. А также, что многое нельзя проверить практикой.
Например, один из вопросов для споров: "когда value type хранится в куче?". Этот вопрос далеко не всегда практический, но часто его задают, чтобы оценить эрудицию и начитанность кандидата статьями. Это неплохая оценка, ведь показывает насколько глубоко любит копать кандидат чисто на интересе. Его задали сегодня в нашем чате.
Тут обычно вспоминают Boxing.
Boxing — это когда значение value type (структуры или enum) кладут в специальный объект в куче. Внутри box хранится само значение, а переменные получают ссылку на него.
Когда происходит Boxing? (Вспоминая великий фильм Seven хочется пошутить What's in the box????). Компилятор прибегает к этому в нескольких случаях:
- когда value type нужно хранить в Any или протоколе
- когда переменную захватывает замыкание и она должна пережить стековый фрейм
- внутри инициализаторов структур, чтобы мутировать self, пока он ещё не до конца сконструирован
Одно из заблуждений, которое встречал на собесах, это ожидаемый ответ "когда структура хранит в себе классы". Но это не совсем правда.
В "куче" структура только "бывает" при инициализации. После выхода из инициализатора box уничтожается, и структура может снова жить как value.
В итоге, как правильно отвечать на вопрос "живет ли структура в куче"?
Обычно структура — это value type, и она хранится в стеке или inline в другом объекте. Но во время инициализации или в особых случаях (замыкания, протоколы, Any) компилятор делает boxing — временно помещает структуру в кучу.