Pull to refresh
-17
0
Send message

6 объединяющих операторов Swift Combine, которые вам следует знать

Reading time5 min
Views8.5K
Перевод статьи подготовлен в преддверии старта продвинутого курса «iOS-Разработчик».




В этой статье мы рассмотрим шесть полезных операторов объединения в Combine. Мы сделаем это на примерах, экспериментируя с каждым из них в Xcode Playground.

Исходный код доступен в конце статьи.

Ну что ж, без лишних разглагольствований, давайте приступим.
Читать дальше →

Combine: часть 2. Вершина айсберга

Level of difficultyMedium
Reading time15 min
Views10K

Привет, Хабр! На связи Сергей, iOS-разработчик в компании SimbirSoft.

В прошлой статье мы познакомились с концепцией реактивного программирования с использованием фреймворка Combine и сравнили его с RxSwift. В этой части мы более подробно разберем виды основных компонентов Combine, а также их отличия и способы применения.

Интеграция Combine в проект будет полезна для обеих сторон — бизнеса и команды разработки:

1. Процесс работы становится быстрее, а значит дешевле.

2. Фреймворк считается достаточно модным. Есть большое количество разработчиков, которым нравится использовать реактивный подход, и которые хотят поработать с новым инструментом — повышается интерес соискателей к вакансиям, в которых фигурирует эта технология.

3. Combine способствует легкой поддержке и удобном переходе на современные технологии в будущем (например, на SwiftUI).

Читать далее

Точность позиционирования объектов в играх: возможные ошибки

Level of difficultyMedium
Reading time3 min
Views1.7K

- Чем чревато брать float или double в качестве типа данных для хранения позиций объектов?
- Как это может повлиять на наличие багов в игре и ошибки синхронизации сетевой игры или реплеев?

Об этом вы узнаете в этом гайде с наглядными гифками и пруфом на C++

Читать далее

Коды избыточности: простыми словами о том, как надёжно и дёшево хранить данные

Reading time11 min
Views34K


Так выглядит избыточность


Коды избыточности* широко применяются в компьютерных системах для увеличения надёжности хранения данных. В Яндексе их используют в очень многих проектах. Например, применение кодов избыточности вместо репликации в нашем внутреннем объектном хранилище экономит миллионы без снижения надёжности. Но несмотря на широкое распространение, понятное описание того, как работают коды избыточности, встречается очень редко. Желающие разобраться сталкиваются примерно со следующим (из Википедии):



Меня зовут Вадим, в Яндексе я занимаюсь разработкой внутреннего объектного хранилища MDS. В этой статье я простыми словами опишу теоретические основы кодов избыточности (кодов Рида — Соломона и LRC). Расскажу, как это работает, без сложной математики и редких терминов. В конце приведу примеры использования кодов избыточности в Яндексе.


Ряд математических деталей я не буду рассматривать подробно, но дам ссылки для тех, кто хочет погрузиться глубже. Также замечу, что некоторые математические определения могут быть не строгими, так как статья рассчитана не на математиков, а на инженеров, желающих разобраться в сути вопроса.


* Под термином «коды избыточности» в статье подразумевается инженерный термин «erasure codes».

Читать дальше →

Шейдер береговой линии для Unity

Level of difficultyEasy
Reading time9 min
Views3.1K

В своей работе я больше склоняюсь к стилизованной картинке, однако полученный в статье результат можно будет адаптировать и для реалистичного стиля/PBR. В этом посте мы поговорим о шейдере воды, относящемся к береговой линии, не касаясь материала песка и других деталей воды, например, преломления и каустики (о них можно прочитать в Water Shader Breakdown или по другим ссылкам в разделе Water на странице Resources). Впрочем, шейдер выполняет и смешение прозрачности/альфы, чтобы затенить материал под ним для симуляции мокрого песка.

Мы поговорим о двух способах наложения волн в сцене: при помощи текстуры глубин и ручных UV. Ниже я перечислю замечания, плюсы и минусы каждого способа. В последующих разделах мы поработаем над ними по очереди.

Читать далее

Моделируем поверхность Земли в пару строчек

Level of difficultyEasy
Reading time9 min
Views3.3K

Вы когда-нибудь играли в Outer Wilds? Планеты там невероятно красивы. Это собственно стало основной мотивацией создать свою простую модель планеты, используя реальные географические данные о высотах и немножко магии Wolfram Language

Читать далее

Yandex MapKit для новичков: разрабатываем карты в Android-приложении

Level of difficultyEasy
Reading time19 min
Views19K

А давайте познакомимся поближе и поработаем с Яндекс-картами в Android-приложении! Внедрим и настроим библиотеку Yandex MapKit: откроем определенную область на карте, выставим метку в нужном месте, установим на неё желаемые растровые и векторные изображения, поиграемся с зумом, обработаем нажатие на пин, а также будем визуально выделять объекты на карте при клике и получать от них интересующую нас информацию.

Поехали!

Внедряем MapKit Яндекс Карт в iOS приложение

Level of difficultyEasy
Reading time12 min
Views7.5K

Всем привет! Меня зовут Серёжа, и я занимаюсь веб-разработкой и разработкой на iOS вот уже 5 лет. На одном из проектов мне поставили задачу: внедрить Яндекс Карты в приложение. Однако я столкнулся с тем, что в открытом доступе мало нужной и полезной информации об этой теме. Эта статья - мои способы решения задач на Swift с использованием Yandex MapKit. Делюсь с вами своим опытом!

Читать далее

Как устроены тени в старых 3D-играх

Level of difficultyEasy
Reading time10 min
Views12K

Ближе к концу превосходной ленты Вима Вендерса «Идеальные дни» главный герой Хираяма пьёт пиво под мостом после того, как увидел, как Бизнесмен ухаживает за девушкой, в которую влюблён Хираяма. Внезапно к нему подходит Бизнесмен. Всё оказалось не так просто, но их беседа приводит их к фундаментальным вопросам:

Бизнесмен: Тени. Становятся ли они темнее, когда накладываются друг на друга?
Хираяма: Не знаю.
Бизнесмен: Я не знаю ещё очень многого... Именно так заканчивается жизнь... Наверно.
Хираяма: Давайте узнаем прямо сейчас.
Бизнесмен: Что?

И они выходят на свет уличного фонаря, чтобы изучить свои тени (сцена целиком).

Хотя Бизнесмен и не видит разницы, Хираяма уверен, что пересекающиеся тени действительно становятся темнее. «Они должны становиться темнее, это логично». Очень сильная сцена.

К сожалению, Хираяма ошибается. Тени не становились темнее. Источник света всего один, и он довольно далеко, поэтому тень — это просто отсутствие света. Не важно, сколько раз перекрыт источник света.

В 3D-видеоиграх же тени — это нечто совсем иное. Очень легко нарисовать тёмное пятно под ногами персонажа и предполагать, что всё остальное освещено. Возможно, Хираяма вспоминал тень-пятно из Metal Gear Solid, которая становится темнее, когда накладывается на другие?

Читать далее

Обертки свойств в Swift с примерами кода

Reading time9 min
Views9.6K

Property Wrappers (Обертки Свойств) в Swift позволяют извлекать общую логику в отдельный объект-обертку. С момента представления во время WWDC 2019 и появления в Xcode 11 со Swift 5 было много примеров, которыми поделились в сообществе. Это изящное дополнение к библиотеке Swift, позволяющее удалить много шаблонного кода, который, вероятно, все мы писали в своих проектах.

Историю об обертках свойств можно найти на форумах Swift для SE-0258. В то время как целесообразность их использования в основном говорит о том, что обертки свойств являются решением для @NSCopying свойств, есть общая закономерность, которая реализовывается ими, и вы, вероятно, скоро все узнаете.

Читать далее

Поделить нельзя — умножить или алгоритм быстрого деления по методу Ньютона-Рафсона

Level of difficultyMedium
Reading time9 min
Views13K


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

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

Как поделить не деля или оптимизация деления компиляторам(и)

Level of difficultyMedium
Reading time5 min
Views11K

Если вы никогда не пробовали смотреть как код на C++ разворачивается компилятором в код Assembly – вас ждёт много сюрпризов, причём, не нужно смотреть какой-то замудренный исходный код полный templates или других сложных конструкций: рассмотрите следущий snippet:

Смотреть код

Описание быстрого и стабильного Motion blur алгоритма

Level of difficultyMedium
Reading time2 min
Views767

Всем привет, эта статья является краткой выжимкой другой статьи: Guertin, Jean-Philippe & McGuire, M. & Nowrouzezahrai, D.. (2014). A fast and stable feature-aware motion blur filter. High-Performance Graphics 2014, HPG 2014 - Proceedings. 51-60.

В ней описан алгоритм Motion blur эффекта, который был предложен авторами оригинальной статьи.

Посмотреть алгоритм

Как работает протокол HLS

Reading time10 min
Views10K

Вот уже несколько недель я разрабатываю серверную поддержку коротких видео для компании Bluesky.

Основное назначение этой фичи – обеспечивать потоковый показ небольших (максимум 90 секунд) видеороликов. Показ должен быть бесплатным и при этом не слишком накладным для нас.

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

Притом, что такая CDN – это полнофункциональный продукт, мы не хотели чрезмерно замыкаться на конкретном производителе и поэтому решили внести в нашу потоковую платформу некоторые улучшения, тем самым расширив спектр предлагаемых на ней услуг и творчески подойти к реализации протоколов потокового видео.

Читать далее

О квадратных уравнениях в правильном порядке

Reading time4 min
Views47K

Как вам преподавали квадратные уравнения в школе? Это был 7-8 класс, примерно. Вероятнее всего, вам рассказали что есть формулы корней через дискриминант, что направление ветвей зависит от старшего коэффициента. Через пару занятий дали теорему Виета. Счастливчикам еще рассказали про метод переброски. И на этом решили отпустить.

Читать далее

Как я создавал эргономичное кресло. Часть 2. Подголовник

Reading time9 min
Views19K

Привет, Хабр! Продолжаю рассказ о том, как я создавал кресло EasyWorkStation, решая собственные проблемы болей и дискомфорта при работе за компьютером. Описанный путь отнюдь не идеален и не лишен "детских" ошибок. Это не призыв в подобных ситуациях действовать подобным образом. Просто делюсь, как действовал я, исходя из своего опыта, образа жизни, привычек и потребностей.

Читать далее

Async / Await in Swift

Reading time14 min
Views15K

Apple представила концепцию async/await в Swift 5.5 и анонсировала ее на сессии WWDC21. Сегодня мы увидим async/await в действии и то, как мы можем использовать async/await для написания удобочитаемого асинхронного кода в своем приложении.

Читать далее

Память в Swift от 0 до 1

Reading time10 min
Views90K

В этой статье мы рассмотрим принципы работы памяти в Swift и разберемся, как Swift располагает байты в памяти, как управляет памятью и что из себя представляет жизненный цикл объектов.

Читать далее

Таймер в iOS

Reading time9 min
Views36K
Представьте, что вы работаете над приложением, в котором нужно периодически выполнять некоторые действия. Именно для этого в Swift используется класс Timer.

Timer используется для планирования действий в приложении. Это может быть разовое действие или повторяющаяся процедура.

В этом руководстве вы разберётесь, как в iOS работает таймер, как он может влиять на отзывчивость UI, как оптимизировать потребление батареи при использовании таймера и как использовать CADisplayLink для анимации.

В качестве тестового полигона мы будем использовать приложение — примитивный планировщик задач.
Читать дальше →

Сложные отображения коллекций в iOS: проблемы и решения на примере ленты ВКонтакте

Reading time17 min
Views23K

Привет! Меня зовут Саша, я iOS-разработчик в команде, которая делает ленту ВКонтакте. Сейчас расскажу, как мы оптимизируем отображение интерфейса и обходим связанные с этим проблемы.
Думаю, вы представляете, что такое лента VK. Это экран, где можно просматривать разнообразный контент: тексты, статичные картинки, анимированные гифки, встраиваемые элементы (видео и музыку). Всё это должно отображаться плавно, отсюда высокие требования к производительности решений.


Теперь посмотрим, какие существуют стандартные подходы к работе с отображениями и какие ограничения или преимущества следует учитывать.


Если вы больше любите слушать, чем читать, видеозапись доклада есть вот тут.


Читать дальше →

Information

Rating
Does not participate
Registered
Activity