Подготовка к собеседованию на iOS Developer
Менторы
Специалисты своей области, которые смогут помочь вам
Middle .Net Developer
Senior Product Manager
Middle Python Developer
Ведущий программист
Backend Software Engineer (PHP)
Senior .NET/C# developer
Middle DevOps Engineer | Tbilisi, Georgia
Middle C# .NET
Senior PHP-разработчик
Middle python developer
Каналы
Полезные Telegram каналы и чаты
Транскрипция видео:
значит Всем привет Мы будем начинать наш открытый МОК собеседования на iOS разработчика Сегодня у нас Халиль в роли интервьюируемый ему удачи Лиль можешь рассказать в двух словах кто ты что ты откуда ты да меня зовут Халиль Я из Казани так войти лет 7 наверно в Ас около 3 лет Ну года полтора наверное уже не совел волнуюсь примерно уровень idle Класс Класс Ну этот волнение можешь отбросить всё будет на позитиве всё будет на чиле У нас тут ничего серного это площадка для рования своих навыков и того никто не осудит никто ничего не
00:00:02 - 00:01:53
скажет класс Хорошо давай мы тогда будем начинать я расскажу пройдусь коротко потому что будет происходить Значит у нас будет собеседование на медла и будет составить анали некоторой водной части от тебя от меня далее будут обычные в основном только вопросы но я ещ и миксал с какими-то реальными задачами так как это больше уже Ну как сказать у тебя есть уже опыт поэтому от человека с опытом требуются навыки решения хотя бы стандартных задач которые могут возникнуть или стандартных проблем которые могут
00:01:03 - 00:02:26
возникнуть при разработке вот а поэтому поговорим просто побеседуем на такие задачи где по сути можно по-разному решить можно по-разному подойти но больше вот показать то как ты к этому подойдёшь что что ты об этом думаешь а да постараемся покрыть какую-то основную базу думаю надо рассчитывать где-то на примерно час собеседования если ты сам лично захочешь я смогу озвучить какие-то там какое-то мнение по вопросам и в целом по собеседованию после собеседования имеется в виду здесь либо если что просто лично поговорим напишу Да хотел
00:01:44 - 00:03:12
бы итоги получить как тебе удобнее будет как бы мне можно и так и лично о'кей О'кей хорошо наверное полезнее будет общее наверное да рассказать ответы какие-то там комментарии Ну да может может чуть-чуть обсудим Главное чтобы не затягивалась потому что Можно бесконечно обсуждать разные вопросы ответы вот стараемся А да вот как-то так давай тогда начнём с некого представления ты её в принципе уже представил Давай я тоже е раз пройдусь Т Меня зовут Я разработчик со стажем 78 лет вот и Да сейчас работаю компания ST шведская
00:02:30 - 00:03:55
компания аудиокниги Окей давай начнём с какой-то базы чтобы вкатиться в разговор так сказать поговорим Зачем нам нужны опциона в sift Ну опциона позволяют работать с данными которые могут не существовать то есть э особенно много используется во всяких моделях которые нам БК шлёт Угу когда какая-то какое-то поле в модели может отсутствовать помечается опционам и мы спокойно уже работаем Ну с несуществующими данными получается выстраиваем какую-то там логику поведения О'кей А вот смотри вот в objective
00:03:15 - 00:04:49
C мы могли конечно проперти помечать там опционально да но в целом мы не сильно там запариваюсь за опциона то есть да то есть как таковой структуры опциона там не был А как ты думаешь что вот добавляет опциона если вот опциона брать из Свифта к чему это приведёт честно говоря по obc тоже понят скажу я вообще не знаю JC его не изучал и пока что в проекте ни разу ни в одном и не понадобилось Да А так прям Сложно представить жизнь без опциона на самом деле Сейчас подумаю что у нас отваливается Ну как минимум сложно
00:04:04 - 00:05:34
будет моделями работать то есть лево ша право модель будет валиться которая нам ска летит потом Ну мне кажется без опциона можно прожить просто усложни U наверное и гибкости меньше станет окей Окей хорошо А ещё говорят что вот у нас Swift - это строго типизированный язык Расскажи пожалуйста что это значит строго тизи Я думаю это имеется в виду в том что у нас нету таких переменных в которых неизвестен тип до компиляции получается до использования по-моему в питоне такие в дарте вроде такое тоже есть Мне кажется
00:04:50 - 00:06:15
это даже хорошо что у нас ну мне нравится такое поведение что мы методы передаём конкретные типы данных а не какую-то переменную окей а могу ли я создать Ну например какую-то переменную и как бы сказать записать туда что угодно любой Любой любой тип данных которы существует чтобы Ну если мы о том об одном и том же то в принципе да то есть мы создаём переменную не обозначая тип данных потом что либо туда за сум и он уже определяет Сам какой тип данных ему записан может мы про это да Угу Допустим мы создаём допустим L а равно
00:05:33 - 00:07:04
сам класс а допустим ну и у него будет тип данных сам класс А хотя мы не указывали ту о'кей О'кей хорошо А давай представим что я словарь создал и ключи у меня там все Пусть будут строки да то есть какие-то ключ ключ это строка А значение вообще разные типы данных Какого типа словар будет скорее всего ри по-моему там будет будет ключи и там то есть если мы какой-то коллекцию там массив из разных объектов создаём то он вроде не становится окей да Хорошо давай плав перейдём к коллекциям Swift которые у нас
00:06:20 - 00:07:45
существуют Расскажи пожалуйста какие у нас коллекции есть вообще коллекция У нас есть массив словарь И множество то есть Окей давай теперь чуть углубит Вот смотри есть у нас массив И я хочу взять и отделить из массива часть массива взять Окей то есть ска что вот вот пусть будет там а последние два элемента вытащить из массива и из этого сформировать другой массив понятно да то есть заслать хочу массив разделить его А как ты думаешь Вот этот разделённый второй кусочек массива Да который мы отделили Он какого типа будет
00:07:03 - 00:08:44
быть по-моему они когда делятся там тип меняется То есть это не будет просто Рей Угу не помню как называется но его можно легко привести в Ну в общем честно говоря не помню как называется Но это какой-то типа кусочек типа на А может ты знаешь зачем это нужно то есть почему это не может быть когда он поделён и может он не знаю То есть я не изучал но могу предположить что возможно его делят Но на самом деле он никак ещ не поделился по-настоящему и потом Возможно мы когда Если хотим дальше с ним работать то он в полноценный массив
00:07:53 - 00:09:12
отдельный превращается наверное может так как-то так и какие-то операции доступные этому Вот прямоточного типу и чтобы если мы хотим продолжить с ним как-то работать он пока сохраняется в этом типе возможно так Окей хорошо вот из перечисленных тобой коллекции Как ты думаешь что коллекцию наме какого-нибудь другого типа Например у нас есть да ка и есть массив или словарь что В чём их отличие будет ну что-то разное можно рассказать но возможно речь идёт о свойстве Может быть потому что коллекция поддерживают
00:08:33 - 00:10:19
потом отли хорошо Вот теперь смотри Можем ли мы например итерироваться по коллекции хорошо и оказывается Ну окей Можем ли мы итерироваться по строке как Яя строка тоже массив по считается даже коллекци О'кей э Как ты думаешь при работе со строкой у нас работает тоже принцип корай вроде бы Вроде бы да Угу О'кей Класс Класс А да Вот немного поговорили про коллекции я в принципе понимаю что ты знаешь такие какие-то моменты Давай последний какой-то вопрос по Давай словарю А у нас есть вот словарь э Что
00:09:28 - 00:11:08
может быть ключом споря это что угодно или какие-то есть ограничения так ключ он должен быть потому что ну через хэши работают как и получается Дик но они одинако по сути работают можно сказать так это что это ну как бы конкретно значит Например у тебя есть структура или класс р назовём его так и ты хочешь чтобы этот класс или структура была ключом словаре есть и клас должны реализовывать протокол Угу Окей окей Ну просто если это он состоит из обычных простых типов они все уже поддерживают просто пишем он автоматом
00:10:23 - 00:11:50
реализуется Если нет то мы ручками уже реализуем Да хорошо класс Давай дальше Я думаю пойдём пока перейдём к такой более большой теме работа с памятью может ты расскажешь что ты знаешь по работе с памятью давай начнём с арка и дальше пойдём потихоньку Угу угу ну есть такой инструмент можно сказать в общем механизм automa reference Counting по-моему называется это получается это механизм он срабатывает на этапе компиляции который подсчитывает за нас ссылки по-моему Ну вот я не знаю там их не было там вроде надо было самим
00:11:11 - 00:12:42
считать до инициали Вроде вот получается есть счётчик и Ну что такое вообще ссылки и о чём это у нас получается память так условно делится на разные куски есть допустим стек есть куча есть ещё некоторые области в памяти но в основном это получается это стек и Куча и как раз и у нас есть разные типы данных есть получается Type и Тай то есть на русском не помню уже как на это ссылочные типы данных все вроде хранимые что ли а тип значения тип значения да ссылочные да и ссылочные типы Почему так называются потому что они хранятся как
00:11:59 - 00:13:51
раз в куче по каким-то адресам у нас в мен хранятся только ссылки на начало адреса по сути этого объекта соответственно чтобы ну освобождать память в этой куче у нас эти объекты должны Ну де инициализировать отпуска получается ну удаляться можно сказать да и соответственно этот автоматический счётчик при создание ссылки на этот объект для этого объекта И если мы ещё одну ссылку содам то там счётчик ещ раз инкремент потом э ссылка уничтожается то есть ВЛ допустим приводится то она счётчик отматывает и
00:12:55 - 00:14:33
если счётчик обнуляется то объект Ну разрешает получается отпустить этот объект Ну и сам он по сути его и отпускает там как я знаю вроде бы из кучи он не обязательны пря типа байты там в ноль прописываются Просто эта память разрешается для доступа для других объектов следующих и переписывается потом Окей давай тогда пока на этом моменте остановимся Хорошо давай по вопросам чуть-чуть значит Вот первые ты говорил ки куча да хранит значимые и ссылочные типы данных Скажи пожалуйста в какой момент вообще создаётся
00:13:45 - 00:14:59
стека вопрос стно говоря так не знаю так если подумать Так ты думаешь даже не знаю может при установке приложения для него выделяется какая-то область или при запуске при запуске приложений может так окей Окей хорошо есть у нас такие сценарий Когда например например Да это вопрос есть ли у нас такие сценарии когда Type может храниться вче Да по-моему если имеет какое-то допустим свойство то он вроде хранится уже в куче хоро второй момент это если эти вот как раз коллекции вроде когда коя on Write срабатывает то на
00:14:25 - 00:16:26
момент копия ота как раз создаётся по-моему Ну он превращается в ссылочный тип на время Угу то есть массивы У нас тоже могут храниться так таким образом О'кей хорошо а а а вот такой кейс У тебя есть Пусть би будет какой-то value Type да э переменная это будет не знаю int неважно да что-то и дальше у тебя есть жур который захватывает этот инт дальше инт после кжу изменяется и в какой-то момент кжу вызывается Вот как ты думаешь Вот вот при такой работе Как каким образом жур захватил val Type То есть это вообще это вот
00:15:33 - 00:17:16
чтото что горя подзабыл этот момент но раз Спрашивается то скорее всего тут точно так и работает как-то ссылочными в ссылочный тип может то есть берётся возможно э может он записывается в кучу и там ссылка берётся чтобы захватить её наверное вот как-то так работа а как у нас вот ты рассказал про кучу И как там у нас счётчики плюс минус О'кей А как стек очищается ну стек получается Он как записывается стеком соответственно последни записаны первым выходит как я знаю и Ну наверное по мере освобождения
00:16:25 - 00:18:05
этого называ контекста что ли то есть ну по выходу из контекста они удаляются наверно Даже не задумался как они там просто когда мы выходим за контекст они про удалятся знаю слышал про слышал А может это как раз с этим [музыка] связано Если не ошибаюсь а срабатывает Возможно это связано спом и в цикле Может в конце цикла наверно срабатывает мы как правило с не используем его потому что он автоматом работает но принудительного запуска АВС Пула он может быть может понадобиться когда итерация делаем с большим
00:17:15 - 00:18:52
количеством данных и чтобы не нагружать оперативку мы можем её почищу почаще Угу Окей хорошо такой ещё вопрос соответственно когда мы говорим про кантин Да разные ты вот сказал что увеличиваются ссылки но по-моему ты не упомянул про разные типы Да я не говорил об этом да у нас три типа ссылок есть по умолчанию это сильная ссылка и есть и слабая и бехо ссылка Да хорошо и Обычно когда мы контексте вот этих ссылок говорим ещё упоминается такая штука как Мы хотим захватить слабую ссылку ссылка то она захватывает не сам объект
00:18:07 - 00:19:39
а создаётся и она привязка Сай зачем это нужно так делать если не ошибаюсь Это для того чтобы то есть явно не связывать объект с переменной ссылки получается И когда объект уничтожается то ссылка ещ остаётся к Сайгу получается остаётся Ну чтобы наверное механизм это работал корректно окей Окей хорошо пойдём дальше Давай попробуем решить какую-то такую абстрактную задачу значит Представь у нас есть таблица с данными Окей и соответственно мы подгружает какие-то пользователи пусть будет каждая яче это какой-то пользователь
00:19:04 - 00:20:56
Вот и у пользователя есть аватарка в каждой ячейки Угу ава такр подгружается отдельно URL подгружается отдельно соответственно Вот и когда мы с кролем таблица мы замечаем что изображение прыгают то есть понимаешь как будто было какое-то старое изображение в ячейке потом хоп новое чей сидят короче что что на чужих ячейках сидят может да может да на чужих ячейках появлятся То есть у нас пусть будет 100 пользователи ты таблицу скли и изображение не то что нужно в ячейке сразу а там появляется с какой-то
00:20:00 - 00:21:27
изображение потом хоп появляется новое изображение И вообще то есть изображение прям очень как-то миято к этому подой С чего ты начнёшь Как думаешь что это такое так помню такой момент там по-моему есть какой-то механизм для таких вещей чтобы закреплять как-то но не помню Сейчас подумаю что можно [музыка] делать так Ну мельтешение происходит возможно из-за того что у нас так работает вот этот ячей доста Угу У нас получается берётся какая-то уже использованная ячейка и у нас возможно заново загружается картинка и
00:20:45 - 00:22:18
поэтому она ещё не успела догруз и возможно там старый сидит может быть из-за этого это происходит а возможно чтобы быстро их менять может быть получится то есть поможет нам тут широва изображений чтобы мы заново не подгружать их Угу То есть у нас ну такой момент может помочь наверное у нас есть инструмент каширования и изображени и в принципе А уров реквест вот этих Ну то есть мы ответы можем закачивать да э ну и есть вроде какой-то механизм там надо будет поискать при задаче ээ именно для Вот таких моментов с картинками
00:21:36 - 00:23:01
вроде их как-то можно как-то там есть какой-то инструмент вроде ну сейчас точно не вспомню Угу о'кей О'кей Ну смотри хорошо частично Окей хорошо каширование есть а вот по поводу переиспользование ячейки Можно ли как-то вообще в принципе сделать так чтобы ячейки Ну то есть вот вот э проблему с переиспользование Как её можно решить чтобы там не сидела старая картинка в момент То есть это чуть-чуть наверное поможет у ячеек есть по этот может быть если про это то там можно почистить То есть просто Удалить предыдущие данные Подготовить
00:22:20 - 00:23:49
для следующего использования Окей там допустим в Нил всё вывести и тогда на чистый подкати Окей Смотри теперь мы используем слабый интернет симуляторе где угодно да то есть и скли быстро таблицу скромно таблицу и замечаем что изображение очень долго подгружается очень долго подгружаются то есть последни у нас условно по 10 ячеек на экране видно до низа доск и невероятно долго подгружается Хотя первые 10 изображений когда ты только включил положение они нормально погрузились Ну относительно то есть медленны конечно интернет но
00:23:05 - 00:24:31
относительно секунды две заняло чтобы подгрузить первое изображение а последнее там почти минуту заняло это очень странно как ты думаешь как к этому подойти ну я думаю это происходит из-за того что у нас ушедшие ячейки всё ещё грузят свои картинки которые уже никому не нужны Угу и тоже есть место вроде где можно это сделать где можно останавливать загрузку просто То есть если ячейка уже ушла то остановить там загрузку загружать только Ну на текущем который экране видны наверное вот так сделать Окей
00:23:48 - 00:25:10
О хорошо давай тогда пойдём дальше в принципе да мы ещё вернёмся к этой задаче чуть будем её усложнять будущем но пока остановимся поговорим собственно перейдём на U Давай поговорим Так ну ты человек с опытом какие-то вещи совсем банальные по U Я постараюсь тебя не спрашивать но нужно вки катос можешь рассказать что это зачем это помогает нам получается верстать интерфейсы для Ну гибкие интерфейсы Для различных экранов получается то есть они сами подсчитывают Ну мы делаем задам какието условия разме они растягиваются
00:24:29 - 00:26:14
самостоятельно под экран и Если не ошибаюсь Он построен на основе системы линейных уравнений и мы как раз задаём некоторые параметры этих уравнений честно говоря глубоко там уже не знаю И эти системные линейные уравнения автоматически решаются и ну находят ответы по размером получается наших объектов Окей хорошо помимо того что мы можем задавать отношения в автолейаут да и ну то есть отношение к объектам какие-то константы если нужно мы ещё можем задать два таких параметра как контент и Да как думаешь что это такое Зачем оно
00:25:31 - 00:27:13
нужно Ну Котен и позволяет нам определять приоритеты на сжатие разжатие получается чаще всего это используется Ну мной как минимум на всяких Лах То есть если у нас есть допустим два став сжи ума который будет занимать пространство такие вещ позволяют нам настраивать Ну и в принципе если у нас есть стопка лов и у них одинаковые Получается эти параметры то Ну в принципе это приводит к ошибке контов и их надо назначить оставить приоритеты Получается кто как будет вво чест гибка позволяет настроить
00:26:27 - 00:28:12
интерфейс по сути Хорошо хорошо Значит ты сказал глубоко особо туда не внедряться мы тогда не будем какие-то глубокие вопросы спрашивать но в целом по вёрстке Какие ещё у нас есть вообще способы встать кроме автолейаут вот что бы ты выделил там плюсы минусы условно таких Но получается они по сути наверное все а но ну имеется в виду у нас есть допустим кода мы можем прописать эти констрейнт просто типа кодом или мы можем верстать в стори бордах к Сиба уже через интерфейс тоже другой вариант вёрстки
00:27:29 - 00:29:00
Можно сказать может неправильно вырезал то есть да мы так можем делать Конечно вот в плане кроме алеута что у нас есть чтобы Я знаю ещ фрейм можно назвать и третий наверно не назову То есть через фреймы можно прописывать размер объектов и их положение Ну на экране получается Есть какая-то разница между использовани Да Разница в том что через автолейаут верстать проще и легче поддерживать множество разме потому что Ну практически одни и те же правила задаются на все экраны но фреймы они ну менее гибкие то
00:28:17 - 00:29:56
есть там нам самим надо просчитывать Все размеры и отступы и ну под разные экраны надо разные получаются фреймы прописывать но они считаются быстрее и вот как раз в таких таблицах если у нас там ячейки сэмен ускорения таблиц это сверстать через фре хотя ну последних наверно моделях телефонах Ну это особо смысла на самом деле не имеет такого давно уже не делал смысла особо сеча такой так Давай перейдём к жизненному ЦИК контро но я не буду тебя спрашивать кажды мева и ты Может расскажешь что знаешь про них
00:29:07 - 00:30:48
Расскажи пожалуйста в каком если какой-то метод у на жизненного цикла Где мы можем переопределить в Юху контроллера Да это вот делают обычно А зачем это делают вобще в целом Ну иногда по наверное паттерну архитектуры предполагается что мы типа полностью в юшку отделяем Ну то есть это позволяет прямо сильно-сильно отделить вю от какой-то логики мы можем полностью сделать какое-то максимально Ну так сказать там тупой интерфейс э и его уже просто подставить вместо обычной View в контроллере Ой таки можно
00:30:02 - 00:31:32
делать А где мне написать код а то есть в какой момент жизненного цикла я могу использовать э размеры которые уже правильно подсчитаны я думаю это в районе где-то там наверно точно уже известные размеры скорее всего ну я иногда делаю когда мне надо получить ям под коне вызва Да но можно но в layout они Ну точно уже построены и там можно получить размер о'кей О'кей А что если то есть смотри у нас сейчас тоже там новый метод жизненного цикла добавился Ты может слышал что-то про него Да слышал но честно говоря не
00:30:45 - 00:32:32
изучал это View из да да из изн что ли Ну Я слышал что там что-то там ching там что-то такое но не разбирался Ну да лапир больше не нужен скажем так если его достаточно Окей так хорошо А смотри Давай тогда поговорим про то что помимо таких методов жизненного цикла которые При появлении скажем так экрана Да у нас есть методы жизне цикла когда экран уходит из области видимости Угу и дальше стирается из памяти вот есть ли какой-то метод который вызывается в момент того когда он сотрётся из памяти перед тем да Ну да и
00:31:50 - 00:33:32
нет Есть ИТ хорошо вот этот метод де ИТ что он фактически делает э вот этот метод де ИТ Как ты думаешь он он удаляет прямо там объект класс или или что происходит Нет помоему он не удаляет просто для нас информация то что он удаляется наверное у нас уже некоторые вещи недоступны как я [музыка] помню В общем в момент конца жизненного цикла контролера во будут связаны с потоками поэтому мы немножко Здесь затронем тоже в целом вот у нас всё что происходит внутри нашего в контроллера Это в каком потоке всё происходит Ну это мей поток
00:32:42 - 00:34:28
это ме поток хорошо а очередь даже можно сказать по Су поток наверно А вот мето Как ты думаешь на каком потоке он срабатывает м наверное Ну я честно не знаю но предположу что На том же самом потоке на том же в смысле на главном потоке Да О'Кей О'Кей О'Кей понял А так давай ещё такой вот вопрос э не знаю ты встречался таким или нет но например у тебя есть какой-то активити индикатор Угу и Ну знаешь крутится дадада Вот и если в момент какой-то когда он крутится остановить приложение гером например визуальным гером да можно
00:33:40 - 00:35:33
нажать у тебя скрин и ты видишь все вхи или просто поставить приложение встало по какой-то прине крутится ВС рано замело но оно крутится как ты думаешь В чём причина тоже не встречал такого именно Ну то есть Почему не изучал но может быть так единственная мысль которая приходит это связано Возможно с лупами то что таймер там отдельно как-то работает может может он на таймере как-то завязан на самом деле связано с анимациями то есть Может что-то в контексте анимации знаешь как они у нас ну так глубоко
00:34:40 - 00:36:19
наверное нет то что чтобы сказать почему анимация не останавливается при остановке приложения окей Окей хорошо Давай пойдём дальше перейдём к потокам соответственно Расскажи пожалуйста какие у нас есть инструменты по работе с потокам из инструментов ну самое основное это gcd кото используется часто gcd это над слойка по сути над потоками есть сами потоки в принципе мы как правило не работаем с самими потоками с треми но такая возможность тоже есть то есть есть потоки тоже очереди очереди по сути
00:35:36 - 00:37:13
распределяют задачи по потокам Вот и на gcd ещё есть прослойка Operation операция и ещё какие инструменты Ну вот и в рамках этих крупных получается прослоек есть свои мини инструменты в трех наверно можно назвать типа как там вот это нефор там по-моему в общем юкс какие-то вот конди Ну типа того то есть ну мы Я если честно рейдами не работал просто теорию такую знаю Окей хорошо а как ты думаешь Вот вообще концептуально в приложении в котором то есть на устройстве на котором есть только одно ядро как вообще работает
00:36:30 - 00:38:06
ного потока как это что как это можно понять ну там это на самом деле То есть если одно ядро то у нас настоящее многопоточная псевдо многопоток контекст между друг другом Катод подно и у нас такая Аля как будто бы многопоток но на самом деле не многопоток то есть у нас наверное увеличивается гибкость работы но по факту скорость мы не увеличим у нас даже скорость будет медленнее чем мы бы работали на одном потоке по сути окей да Хорошо я сейчас в чат скину задачу у скажем так классическая в плане того что нужно
00:37:20 - 00:38:57
сделать нужно рассказать В каком порядке распечатывается можешь плохо рассуждать и потом ну прин оди первым распечатывается Извини дальше у нас дипа это главная очередь получается и в главную очередь мы задачу закидываем асинхронно соответственно Ну как и надо работать главной очереди только асинхронно потому что она последовательная вот мы закидываем асинхронно но как бы задача заканчивается мы Настин этот конце сам скобка закрывается и там Принт се Угу Вот тут я думаю что есть вероятность различного Исхода То есть может и двойка
00:38:28 - 00:40:14
сначала прописаться потом семёрка или семёрка двойка скорее всего что-то такое будет Угу Так дайм что мы давай этот код исполняется где-нибудь по VI контроллере в методе хорошо дальше получается или двойка или семёрка дальше glob то есть глобальная очередь из сах ниши приоритетов то есть приоритет у него Ну очень-очень там далёкий В общем так и ещё глобальная очередь Да так 3 Дальше У нас есть Global просто 4 GL Тут ко не указан по-моему он есть такой Кос вроде то ли там де буде и есть ещё disch
00:39:21 - 00:41:02
Global то есть такой же только асинхронный так и тут три подряд они [музыка] идут Так у нас есть Global syn и asn так Сейчас подумаю синхронно Ну есть получается у нас скажу что есть получается параллельные и последовательные очереди параллельно они выполняются Ну одновременно можно сказать то есть могут работать последова только одна Задача в одно время получается и синхронно асинхронно это уже как мы закидываем задачу В эту очереди если синхронно мы дожидаемся завершения если асинхрон то не дожидаемся продолжаем
00:40:29 - 00:42:12
работать пер асинхрон с бэкграунд косом закинет мы не ждём скорее всего она сразу не выполнится ещё потом мы глобально э очередь ещё раз закидываем уже синхронно но она выполнится только после того как предыдущая задача закончится м а предыдущие у нас на глобальной очереди это тройка но она синхронна Угу так Ну можешь попробовать ещё раз давай не знаю в чат распечатать Как ты думаешь Давай пусть будет вот так сейчас да Так проще будет писать потом путаюсь в таких задачах они даются Да [музыка] так сейчас ещё Чутка подумаю двойка
00:41:24 - 00:43:31
семёрка потом возможно шестёрка глобальная очередь у нас параллель поэтому проблем особо не должно быть то что мы синхронно ту затим то есть блока не будет Угу М выполним наверное так background ass 3 может быть выполнится 534 может вот так Ну пока так напишу скорее всего ошибся В общем какой А я же не ой Окей хорошо так Ну я потом разобрать задачу будет разный В зависимости от ситуации единственно вот как бы момент что именно будет разное то есть всё будет одно и тоже но одно из одна из цифр будет действительно выполняться
00:42:39 - 00:44:32
рандомно в зависимости от ситуации скажем так окей Давай пойдём дальше по значит работе с потоками такую задачку свя давай так скажи пожалуйста по дефолту Какого типа у нас когда Ты создаёшь какой-то Operation она у нас или Con последовательно или па подзабыл вроде как создаётся чисто рандомно только могу ответить не помню как по умолчанию наверно ой можешь ты выделить какие-то преимущества перед gcd Да есть некоторые моменты Ну как преимущество Да отличие преимущество то что операции во-первых у
00:44:10 - 00:46:01
них есть жизненный цикл и мы их можем останавливать то есть отменять потому что в если мы какую-то задачу закинули то то есть мы потеряем контроль над ней в в операциях мы можем завершить операцию до начало получается Если она началась выполнять то тоже Мы конечно не остановим е уже дальше нас Мы можем в операциях выставлять зависимости то есть мы можем создать две операции и сказать что вторая после первой допустим также [музыка] ой ой Хорошо давай тогда чуть-чуть дальше спрошу Ты знаком с более
00:45:15 - 00:46:53
такими новыми способами работы с ного поточну прям прок не работала знаю неработа там есть таму есть примерно тоже самое на самом деле просто там такой последовательный подход Ну по сути там тоже создаются таски их тоже можно там группировать такие вещи доступны просто Это можно сказать следующая там надка ещё более абстракт Она довольно сильно упрощает жизнь Я чуть-чуть в своих проектах использовал Да приятно пользоваться но пока продава ве поговорим как потока безопасности то есть мы поговорили про то как вообще работать с
00:46:06 - 00:47:48
потоками Да а вот с точки зрения потока безопасности Как ты думаешь есть ли у нас какие-то проблемы с потока безопасностью например основных коллекций или они все потока безопасные имеется в виду ну про коллекция типа массива и так далее да да да наша коллекция ко в начале перечислял Ну как я понял под поток безопасностью Также имеется в виду как типа как записи удаления и так далее И эти инструменты поток безопасные или нет И Ну стно не помню прямо точный ответ но я думаю не потока безопасны и мы
00:47:05 - 00:48:26
можем с этими потоками накосячить наверное когда работаем какие у нас способы есть делать Вот такой потоку безопасности разного уровня Да ну такие вещи у нас есть как инструменты различные как Лог семафоры и Допустим мы не знаю с массивами наверно как-то если их какую-то ещ прослойку написать то есть можно [музыка] Ну точно прямо сейчас реализацию не скажу но мы можем допустим операциях доступа к какому-то элементу блокировать доступ через допустим Лок одной операции и когда она получается завершается он её
00:47:52 - 00:49:42
отпускает тоже Тае два потока хотят получать доступ к этому элементу и как-то это называется как голодание что ли что-то такое то что один Ну мы не гарантируем то что они будут эти потоки последовательно получать доступ и такое может быть что там за 10 допустим итераций там восемь раз получал доступ один и тот же поток такой тоже может быть это ну локом это не решить общем такие вещи можно решить какими там последователь очередями наверно просто гарантированно получали Ну последовательно Окей окей Ну и разные вот эти основные
00:48:50 - 00:50:31
проблемы стандартные как вот такие вещи их могу тоже рассказать Ну ес на зада с таблицей значит нас таблица помнишь картинки Да ВС мы какие-то Баги и ты упомянул каширование Как нам сделать каширование чисто своими инструментами не без библиотек обычно используем конечно всегда библиотеки широва э есть можно весь это получается объект зашивать это у что ли есть Ну в общем там можно прям очень просто выставлять каширование назначать количество памяти которое разрешаем использовать для кэша и он просто сохраняет ответ получается и при
00:49:43 - 00:51:33
повторном запросе он выт старый по сути ответ Угу и ну и у картинок есть прям NS кэши что ли Ну в общем у картинок есть свой ещё ну для картинок отдельно просто можно кэш реализовать Угу Окей например ты реализовывает свой кэш Есть ли разница что Каширова IM или картинки Да как ты думаешь Обычно мы используем просто библиотеки типа как может знаешь библиотеки как но как я я не не реализовал прям кэширование сам не делаю то фичу сервис но я думаю они в дату переводятся и так сохраняется потом обратно перегоняю А
00:50:48 - 00:52:46
почему не сразу возможно вообще нельзя зашивать такое может ответ быть возможно U больше весит чем Да при могут быть да О хорошо Так значит вот у нас такой кэш есть в приложении хорошо исть уто храним результат вот этих пользователей которые получили и у нас есть пагинация то есть мы скро по 10 пользователей получаем массив с данными добавляем вот относительно всех тем которые мы обсудили Как ты думаешь Есть ли какая-то проблема с тем что мы добавляем элементы в массив после получения их Да СС запроса потом ма используем для
00:51:53 - 00:53:41
обновления таблицы может ли что-то здесь пойти не так если мы запрос делаем соответственно мы используем просто URL Session для запроса ничего такого и дальше Давай так используем стандартные колбеки Да какой-то кобер который возвращает ответ из URL сена Ну тут с потоками наверное может быть проблема и наверно возвращать надо уже в потоке или такие вещи Может быть окей окей окей с точки зрения вот этих кжу потоков которые мы используем люди люди очень часто любят писать внутри и для где ты используешь кжу буд
00:52:56 - 00:54:52
то или какой-нибудь или ещ что-то в таком духе Ну нет то есть у нас допустим айх там вообще не надо он вообще в принципе не захватывает по-моему контроль Ну то есть вот захвата он не производит То есть он синтаксис похож но там такого нету инструментам не надо писать ничего потом в функциях высшего порядка тоже мы так не делаем и Ну если мы не используем получается методы или свойства допустим контроллера то тоже нету смысла его захватывать если мы просто кайто сть использу мы можем не весь контроллер захватывать а только какие-то
00:53:58 - 00:55:50
там свойства его допустим если нам надо Можно так сделать с точки зрения смотри например экра и ты сделал запрос на что-то внутри этого экрана Окей ответ те вж хочева если мы уйдём с этого экрана вот этот ответ который нам вернулся например Мы хотим отправить то что там вернулось что вообще факт того что успешный запрос произошёл хотим логировать или отправить в аналитику что-то такое сделать Можем ли мы как-то гарантировать что даже если ты вот сделал запрос ушёл с экрана А и всё равно код который в кжу он
00:54:59 - 00:56:43
отработает да можем то есть для этого мы получается захватываем слабую ссылку допустим слабая ссылка позволяет уйти этому контроллеру но внутри мы сразу лучше допустим захватить потом сильную ссылку вот это слабость получается и Даль у захваченный контро Станется получается пою делаем и после завершения вот этого скоупа получается у нас ну окончательно отпустит в контролер Окей ну то есть надо просто Гард делать и потом срабатывать это ну я думаю это лучше всегда делать если у нас там не одно поле Угу
00:55:53 - 00:57:39
чтобы не было такого что у нас частично какие-то вещи выполнились там три три строки выполнились а потом ну контроллер ушёл допустим в этот момент как раз чтобы какая-то такая неясность не оставалась Нужно ли те не факт что даже тебе это нужно чтобы ну да ну вот чтобы не думать так А может быть меня тут и не понадобится типа ну с другой стороны то что ты там что-то не что-то не выполнит контроллер это можно считать некой оптимизацией Если тебе это не нужно если пользователю не нужно видеть обновление
00:56:47 - 00:58:03
например чего-то да знаешь или подгрузка чего-то тоже верно просто в проекте разные люди бывают как бы и кто-то может понимать что будет происходить а кто-то может не понимать окей Окей Хорошо давай прави принять наверно в команде Ага Окей хорошо Давай дальше пойдём сейчас будем заканчивать уже буквально пару вопросов по работе с сетью в целом какая разница по работе с сетью между тем чтобы например сделать приложение по такси или приложение где Ну какой-нибудь записная книжка где нужно где есть пользователь и
00:57:26 - 00:58:55
можно получить там знаешь с сервера последние твои записанные данные на другом устройстве есть ли какая-то разница с точки зрения работы сетью Ну я думаю тут имеется в виду проб сокеты наверное угу Тоже не работал с веб сокетами но понимаю смысл что получается у нас в такси мы должны получать без запроса какие-то данные то есть ну открывается соединение и двухсторонняя связь налаживается потому что мы не можем Ну это не будет оптимально каждый раз там с частотой там 5 секунд запрашивать положение такти и так далее а в книжке
00:58:10 - 00:59:33
мы просто один раз получили и всё Окей хорошо хорошо А да А хорошо Давай перейдём к работе Немножко с паттернами в целом Значит у нас могут быть разные ситуации Да давай поговорим для начала про какие-нибудь порождающие паттерны можешь вставлять какие-то какие-то порождающие паттерны знаешь разные типы Да по паттернам тоже не силн конечно на практике но порождающие паттерны Если не ошибаюсь это не про вот эти фабрики и так далее да да то есть прощ тогда паттерны знаю как минимум фабрику супер классическая тема
00:58:52 - 01:00:35
это некий Объект который позволяет создавать другие объекты Ну допустим у нас сложная какая-то логика создания мы делаем фабрика она нам Ну готова через один метод выдаёт а е поведенческой какой-то паттерн мо нать поведенческие Ну знаю такие как помоему вроде называется цепочка получается задачи выполняется друг за другом потом есть вроде бы команда команда позволяет нам получается в один обект можно сказать собрать какую-то логику И потом её вызывать по необходимости Ну то есть готовый такой кусочек команды
00:59:45 - 01:01:27
короче Хорошо давай кстати чуть-чуть про поговорим как он у нас используется вообще в приложении где На каком уров его можем встреть если это касается уже работающий механизма возможно имеется в виду про UI respond да Ага хорошо расскажешь как он работает да могу рассказать могу ещё про хите сказать потому что се Давай быстренько Да быстренько скажу не затягивает есть получается тест Он обрабатывает То есть это такой механизм который позволяет найти UI по котором был ну который был нажат можно сказать
01:00:40 - 01:02:11
допустим если мы нажатие обрабатываем как это срабатывает мы нажимаем и создаётся Action Action создаётся по-моему U Application и Window вроде и дальше по цепочке VI рекурсивно поднимается вверх по иерархии чтобы найти наше на котором бы получается нажатие соответственно если у нас допустим Ну просто скажем есть View и потом на нём кнопка допустим то мы сначала на View сделаем тест тест по сути находит просто координату она Ну включена в это вю Или нет просто ну супер тупо так соответственно если в
01:01:30 - 01:03:00
этом вю есть потом она переходит на кнопку если это область совпадает с кнопка то он понимает то что кнопка была нажата и дальше надо найти уже chin chin он [музыка] находит Объект который сможет обработать Ну то есть выполнить какой-то метод получается соответственно если это кнопка то мы нажимаем на кнопку мы поняли то что это кнопка дальше ищется тот кто сможет обработать метод Ну в Гете который мы допустим запускаем и он ищет через ре метод забыл но в общем ищется тот кто сможет выполнить команду В общем
01:02:15 - 01:03:58
и смотрит уже наоборот сверху вниз идут и если в этом получается контроллере есть метод такой то он его и выполняет если нет ели там допустим селфи Или nil прописать если nil прописан то он уйдёт дальше вниз э искать того кто сможет это выполнить Окей нано такая вещь и ну у нас есть получается класс UI responder и все UI viw они наследуют Рен по сути это основа uw Угу Класс супер А думаю всё можно завершать закрывать собеседование а Спасибо всё хорошо спасибо тебе шёл да
01:03:09 - 01:04:38