GCD - Каверзные вопросы и задачи на iOS-Собеседование - Mad Brains Техно

Подготовка к собеседованию на iOS Developer

Транскрипция видео:

  • самых смешных самый смешной вопрос кем вы видите типом себя через когда тот самый смешной вопрос я думаю да можно будет потом чем такой сделать короче примерно вот так это выглядит есть только кусок кода это будет напечатан ну это одна задача это вторая за дальше они примерно но нет но они разные тут разные будет напечатано в принципе у меня вот есть небольшой playground здесь в принципе ничего нет у нас есть этот метод мы его вызываем не пугайтесь по поводу рану папа просто если мы не запустим рану вто асинхронные задачи

    00:00:02 - 00:01:45

  • playground я не просто окна цонов а из-за того что из за того что это playground по прибавить что я прибавлю конечно сейчас я даже перезапущу накрутим огромный вызов так вот метод вот вот такой вот метод отличный вы можете сделать предположение что будет напечатано в итоге то есть просто нужно порядок вот штуку вы можете этот использовать командный разум идеации предположениям и итоге разберем все равно этот пример но пока вы можете просто предположение свои сделать нет но я могу сказать точно сначала будет а вы красавчик я направил

    00:00:55 - 00:02:47

  • его нет в том то и суть что здесь всегда один и тот же результат но но он всегда один и тот же будет то есть в любом случае потом бы не запустили он будет один и тот же давай ну и бренды да ну нет нет нет там есть глагол вот ты можешь смотреть просто на экран или морс давайте кто-нибудь предположение неправильно неправильно неправильно на самом деле близко тогда вы с красавчик все tolyan разгадал но нет нет нет нет мы пройдем плавно по этому всему и объясню почему это так работает а потом будет еще одна задачка и вот я уже

    00:02:13 - 00:04:51

  • можно будет сразу перейдем к самому базовом понятию этот трек что такое thread я не ну окей все отлично загрузилось что то что то что такое трек это самые низкоуровневые понятие это наименьший единицей обработки ta ta ta ta ta ta можете зайти на википедию но нам нахуй это понятие не нужно то что мы не работаем с рядами нам главное знать что есть main трек в котором выполняются все основные задачи такие например как работу с его им это все происходит в главном потоке и изначально когда вы просто запустили

    00:03:36 - 00:04:43

  • приложение допустим какой-то если вы ничего сами не придумывается у вас есть только один поток главный поток и все выполняется в нем напрямую с потоками работать нам не нужно поскольку у нас есть bcde магическая штука такая которая разруливает всю эту работу за нас и вместо потоков мы работаем с очередями очередь это такая абстрактная очередь в которую выстраиваются задачи для последующего в выполнении ну эта очередь ничем не отличается того как если вы там допустим придете хотя бейли и терочку и

    00:04:10 - 00:05:12

  • увидите там стоят какие-то люди вот есть последовательная очередь в ней задачи выполняются одна за другой собственно и собственно то задача которая в эту очередь поступила первая она и выполнится первое ну вы пришли в магаз есть одна касса какая-то если вы стоите там двадцать пятом то вы наверное будете очень долго ждать вы будете ждать пока все вот эти люди которые стоят перед вами и всех обслужим это последовательная очередь соответственно последовательной в очереди мы всегда знаем что если задача

    00:04:41 - 00:05:46

  • пришла последней она и выполнена будет последний но есть еще а мейн-кун main pool это главная очередь это соответственно последовательной очередь который всегда выполняется в главном потоке по сути она оборачивает main крепче до мэнкью ну в задачах интервью обычная фигурирует именно main пью поскольку результат вы выполнение последовательной очередь он всегда одинаков и известен заранее потому что задачи выполняются последовательных но помимо последовательных очередей есть еще конкорд очереди это либо параллельные очереди

    00:05:14 - 00:06:31

  • либо ну короче называйте как хотите лучше просто называть по-английски кантора вот и в ней задачи могут выполняться одновременно несколько разных задач если у системы есть на это ресурсы и главное наверное штук а почему на конкорд в очереди нет никаких задач потому что задача на могут закончить выпуск выполнением абсолютно рандомном порядке мы можем посмотреть на эту картинку вроде как вторая задача она начала выполняться после первой но в итоге вторая задача закончилась раньше чем первые потому что наверное на нее надо

    00:05:52 - 00:07:14

  • было меньше ресурсов и еще чего то вот поэтому единственное в чем мы можем быть уверены если вторая задача была добавлена собственно после первой она начнет свое выполнение после первой и все больше мы ни в чем уверены быть не может окей как с этим всем работать для начала просто посмотрим например обычного года обычный кот он выполняется последовательно строка за с такой то есть есть какой-то фарс метод допустим здесь есть собственно три строчки кода a b c мы вызываем его и у нас печатается a b c логично мы просто прошли по всем

    00:06:33 - 00:07:52

  • строкам подряд и выполнили окей можно добавить асинхронный блок асинхронный это значит что при добавлении задачи в очередь мы не будем ждать пока она выполнится и можем сразу же перейти к следующей строке кода допустим мы поменяли наш метод вот так то есть мы печатаем а затем мы добавляем в очередь какой-то блок который напечатает нам b и печатается что произойдет в данном случае будет напечатано а cb но я думаю большинству должно быть понятно почему но может быть кому то непонятный much as это разберем

    00:07:12 - 00:08:20

  • здесь мы добавили асинхронную задачу то есть мы ее добавили и мы не обязаны ждать пока она выполнится до конца и мы можем сразу перейти к следующей строке кода собственно после а ну и напечатаем цель и потом когда-то будет напечатано б но сейчас чтобы это все подробнее понять я попробую объяснить пошаговый что происходит шаг первые first метод на начинает выполняться в главном потоке он выполняется главном потоке потому что ну потому что это просто playground и здесь все будет выполняться в главном потоке

    00:07:46 - 00:08:55

  • если мы не создадим какие-то дополнительные потоки руками и соответственно в в обычном приложении изначально у вас тоже все выполняется в главном потоке если вы руками не создаете или если у вас какая-то либо вниз низ создает под капотом какой-то другой поток мы его начали выполнять выполнить за строка print а на печатается а это логично в главную очередь добавляется задача она будет выполнена только тогда когда освободится главный поток а поскольку главная очередь она всегда работает в главном потоке

    00:08:21 - 00:09:29

  • главный поток asus освободиться тогда когда полностью выполнится first met поскольку мы добавили задачу асинхронно мы сразу же можем перейти к следующей строке кода соответственно на дне на печатается princess ну то есть она печатается цель выполнение first метода завершено наш главный поток освободился и главное очередь начинает выполнение добавлены задачи то есть вот этого блока который мы добавили вот этого он по сути начинается выполнение только после того как выполнился first метод и соответственно уже после этого

    00:08:54 - 00:10:12

  • напечатает cb все на этом вот вот этот вот пример он закончит теперь пример синхронные задачи когда мы добавляем какой-то блок сен синхронно это значит что при добавлении задачей в очередь мы обязаны дождаться ее в выполнении до того как перейти к следующей строке кода то есть вот мы собственно осин заменили на сил и и при запуске мы почему-то получили вот такую ситуацию у нас просто все наши краж нос и мы такие думаем а почему у нас тонов и крашнулось ну давайте разберемся почему у нас все прошло опять же фёрст метод

    00:09:32 - 00:10:58

  • начинает выполняться в главном потоке выполняется строка прим а печатается а но это мы явно видим у нас anons напечаталась затем что мы делаем мы добавляем синхронный блок в главную очередь эта задача будет выполнена тогда когда освободится главный поток поскольку главная очередь доработать главном потоке главный поток в нашем случае освободиться тогда когда полностью выполнится first метод поскольку мы добавили задачи пирсинг синхронно мы обязаны дождаться пока она выполнится до того как мы перейдем к

    00:10:17 - 00:11:23

  • следующей строке кода то есть мы не сможем перейти вот этой вот строке кода до того как не выполнится вот этот вот блок first метод не сможет завершить свое он выполнение до тех пор пока не выполнится синхронный блок но это то о чем я вам сказал но при этом синхронный блок не сможет начать свое выполнение пока не освободится главный поток то есть пока не выполнится first метод и получается что first метод ждет вложенный блок а вложенный блок ждет пока выполнится фёрст метод и в итоге бесконечное

    00:10:50 - 00:12:02

  • ожидание d-блок играешь на и вот примерно поэтому не стоит никогда вызывать синхронное выполнение в той очереди который вы уже находитесь сейчас если у вас если у вас конкорд кью вам в принципе может повезти и вас мне зал очередь нахуй если конкорд духе задачи выполнялась в другом потоке ожидание будет в любом случае до но если задача будет выполняться в том же потоке в каком выполняется ну блин в таком вы засунули вот вот этот блок то есть допустим вы можете написать dispatch у global sing допустим да и в принципе

    00:11:24 - 00:12:55

  • наверное ничего не должно произойти но иногда может произойти такая штука что ради оптимизации он это все начнет выполнять в основном потоке и тогда у тебя все равно все начнется вот как то так ну просто так вообще не стоит делать но насколько я понимаю в теории такого не должно быть начисто ну то есть блин на практике этого не должно быть но в теории это возможно и они советуют даже в конкор and you не страдать вот такой вот приняли не не вызывать на текущую типа очередь ну короче не надо так делать

    00:12:14 - 00:13:33

  • разобрали почему она крошиться ok разбор первой задачи ну опять же давайте разберем почему так происходит мы напечатали а затем мы видим вот этот большой асинхронный блок мы его добавили в очередь и забыли про него напечатали f увидели еще один асинхронный болт его должен добавили в очередь и забыли про него на этом в выполнении first метода закончилась затем мы приступили к выполнению первого блока который был добавлен в очередь мы напечатали б затем видим еще еще один блок его должен добавляем в очередь но он уже в очереди

    00:12:56 - 00:14:20

  • будет стоять уже после вот вот этого блока потому что этот блок был добавлен первым ну да вторым дар вот этот блок большой был добавлен 1 вот этот блок джек был добавлен авторы а затем получается был добавлен блок c затем добавляется блок d затем мы синхронно глобальную очередь глобальную очередь для тех кто не знает это по сути обертка над каким-то программ трендом вот то есть мы в background 3d запускаем вот эту задачу при этом мы запускаем или синхронно то есть мы нет не сможем пройти дальше до тех пор пока не

    00:13:38 - 00:14:58

  • закончится в выполнении вот этого блока но в данном случае дидло по у нас не будет собственно поскольку мы выполняем это не в самой очереди а в каком-то 2 ground потоки соответственно мы дождались пока вы выполнилась вот эта напечатали ген то есть на данном этапе у нас есть а.ф. блин а фбр затем выполнения вот этого основного блока закончилась и что у нас сейчас есть в очереди у нас есть очереди вот эта штука g есть в очереди вот эта штука c и вот эта штука д мы просто их по очереди печати и получается

    00:14:18 - 00:15:41

  • соответственно то о чем говорил так вот ну так красочно но со второй попытки ну клин хотя бы со второй окей но есть ещё одна задача вот такая вот здесь я открою код наверно чтобы можно было его приблизить офигенно и вот здесь будет уже немножечко по сложнее ну это на самом деле я нашел на stackoverflow вот это вот задача до искал похоже что ее будет тоже не плохо сюда вставить я прибавлю вот как то так опять же думаем думаем думаем делаем ваши ставки что будет напечатано в этом случае ну где то сломается да этот это

    00:15:00 - 00:16:40

  • правильно но опять же а почему она должна сломаться есть вот тут вот у нас мы сначала переходим в global а потом переходим может все таки не сломается на 68 так на 60 но я скажу теток 68 строчка вообще даже не выполнится мы до нее даже не дойдем до все упадет еще раньше не ну да конечно ну пока да пока правильно а и б так а потом чтобы а и б он сдох от красавчик потому что он абсолютно правильно будет выведена а и б.ф. а потом будет выведен большая красная строчка и вся вернулся и to provide и не думаю

    00:16:09 - 00:18:27

  • антох уже павел почему так произойдет но я постараюсь объяснить час почему так произошло так произошло ну да сначала них не печатается а потом и потом б я думаю здесь все поняли почему так ну да смотри то есть вот это мы напечатали затем у нас есть какой-то асинхронный блок который мы просто добавили в очередь он будет выполнен когда-то ok затем у нас есть синхронный блок то есть мы обязательно должны выполнить его прежде чем попадем дальше мы начинаем его в выполнении он выполняется в глобальном каком-то потоки бэкграунде

    00:18:18 - 00:19:34

  • сен синхронно на данном этапе d-блок а пока еще не будет мы печатаем с но вот здесь вот уже начинаются проблемы из-за того что мы вызываем синхронное выполнение в главном потоке но при этом главный поток пока еще занят выполнением всей вот этой вот штуки то есть главный поток на данном этапе он еще не освободился и соответственно чтобы главный поток освободился он должен выполнить вот этот большой блок но большой блок не выполнится до того как не выполнится вот эта штука потому что вся эта обёртка она

    00:18:56 - 00:20:07

  • синхронна в и поэтому мы опять же получаем дидло и ну да все кто сказали что будет вот так вот они красавчики все кто не сказали что будет так надо просто еще одним немножечко потребуется потому что такие задачи реально очень любят далась визе и в принципе они могут быть разнообразные то есть можешь допустим сюда еще какой-то sing-sing блок скачать очевидного если такую встречу где-то там что-то называется слушай на самом деле если ты видишь такое входит а да лучше такой не писать вообще и вот это вот вот

    00:19:32 - 00:20:53

  • вот такая вот ебанина кроме как в теории она не встретиться не когда то есть это нужно только для задачи на собеседование в реальной жизни такого не будет можете сразу знать это и но это примерно как я не знаю написание сортировки руками по памяти то есть но окей pink ты можешь написать ее вопрос а нахуя если уже все реализовано но здесь в принципе иногда вам придется это это слышно еще и рык сюда навешивать этого это снежного легко я тоже сходы не смогу сказать ну и да еще хотел отметить почему довольно часто работает костыль

    00:20:13 - 00:22:15

  • видео засовывание всего подряд из пачки умей на сим и там обновление его я допустим или еще чего-то но потому что опять же то что мы засунули в васин блок это не значит что а задача будет выполнена брандо и момент времени она будет выполнена рома тогда когда все задачи до неё будут выполнены и соответственно да да вот в этом и смысл что сто процентов уже будет отрисован говори правильно но опять же не стоит этим увлекаться потому что вполне возможно что на следующем цикле ваши лайки рисуются и типа он уже будет

    00:21:37 - 00:23:01

  • не от не актуален и вам надо будет все равно обновить тот layout поэтому ну как бы это прям касты который в одном кейси из 50 сработает и скорее всего он же вам потом выставит логу то есть ну тебе не надо такого делать если есть возможность разрулить это как-то более четко и более более чисто и понять почему вообще что-то идет не так то лучше пытаться понять почему что вопрос такой в playground и вообще все идет в одном игра не обязательно может быть 50 потом а playgrounds опять же изначально в любом

    00:22:19 - 00:23:37

  • приложении что в playground и что в на рм ну что в нормальной приложите изначально все идет в главном потоке но я до конца не понял вот у нас есть очередь main есть у нас очередь global global нас последовательное тоже так по изначально да она вращается правильным мэй ну или нет так слушай а до изначально global она con carne но это не имеет по сути данном кейсе вообще нет никакой роли это но смотри они работают 2 разных потоках то есть main это основной пред обедом и но нет да не обязательно опять же

    00:23:10 - 00:24:47

  • но иногда им но иногда если ты делаешь глобальную очередь вообще когда ты делаешь какую-то очередь то есть когда ты делаешь новую очередь она может создать себе новый поток и уже в нем потом работать но иногда для оптимизации она может использовать основной поток если на данном этапе там ничего не выполняется из на свободу вот как то так то есть в данном кисть скорее всего они будут работать в двух разных потоков в итоге то есть main работает в моем потоке а для глобала создастся какой-то другой

    00:23:58 - 00:25:11

  • поток в котором будет выполняться вот это глобальная чтобы то есть ну погоди получается если у нас два разных потока то у нас в принципе нет гарантии что вот именно такая последовательность выведется то есть если сейчас все выполняется синхронно а на реальном девать у нас будет рис кондишен нет нибудь почему ну смотри вот вот этот блок да вот этот блок весь смотри мы мы дошли вот досюда да допустим вот вот досюда затем мы вызвали вот эту штуку смысл в том что мы не сможем а приступить к выполнению вот

    00:24:35 - 00:25:57

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

    00:25:19 - 00:26:58

  • точность ждут друг друга вот опять же вопрос в том если это конкорд очередь захочется ли она но быть приседе должны обработать он дальше но лучше он он вроде как прошел позволяет сказать что мы можем там есть потоков и хватает он открыть еще один папа используем весна он заблокировал главный поток говорим запрокинуть заблокировал программ пошел бы еще один 100 грамм упругой попы хотя вызывает также богу лучше ну а если допустим мы сделаем так нет нет нет ну да свою очередь стоят я хочу свою очередь и как сделать там

    00:26:24 - 00:27:56

  • тепло q1 там допустим хвост background атрибуты нужны блин ну пусть будет content of the release фигасе нет мне не надо это же можно просто убрать ну и соответственно окей мы можем взять просто выполнить от на крюке ну опять же вот вопрос опять же вопрос что произойдет ну да опять же то же самое но если я сделаю сериал там точно будет ой не туда изначально серия ну до смерти как-то к рутинных такого не устроишь нет но здесь есть ns апельсин как зина от не можешь это все делать без gcd делать на

    00:27:23 - 00:30:06

  • 1 1 но там ну да в принципе она немножко по-другому работать можно вообще сделать вот такую вот хуйню типа ну прям руками и да да наверное даже позволить а ну не но если foundation подключишь может быть позвольте не знаю но вообще это вопрос такой конечно один вопрос ну я бог дал pcd не думайте ни о чем лучше сделать может быть она будет не настолько оптимизирована но зато вы хотя бы не отстрелите себе руки ноги и еще что-нибудь там ценного короче впишите последовательно до grand central dispatch на грант центр он

    00:28:43 - 00:30:48

  • великий центральный слушай я думаю мы можем знать что сделать мы можем зайти google зайдем скажем dcd versus реально есть апа так быстро ты тот сразу вопрос ваши читают слишком сложно слишком сложно 3 join ебут x и кондишен variable это все это у меня непонятно непонятно какие преимущества пересмотра да [музыка] так вот так вот тут пока просто пишет что типа в гтд придумали специально для для того чтобы вы не опаивали ну да это прям супер базовая штука типа торрент портреты непонятно вообще нахуй использовать их

    00:29:48 - 00:32:05

  • если можно использовать 13 сидим вот так плюс р плюс р пришел к врачу и circus ты всем даже интересный всегда псевдокод пол до асинхронный стас отлично это что-то видимо плюсовая какая-то жесть блин а что такое допустила boost не впизду это слишком сложным для пятница что пишут имхо хлеб не намного сложнее сидит мужик может быть реально нас потоки не знаю блин не этот чувак какой-то слишком вы вы посмотрите сколько он высрал выглять она не влезает в экран мы посмотрите сколько он быстро от него

    00:31:14 - 00:33:12

  • это блин я не знаю я приму даже плюс поставил просто за то что та блин столько сидела печатал реально pptpd which was так сейчас вот сразу вас не надо из использовать в отряды не надо макс не надо эта все короче мы поняли не стоит оно того еще дальше фигня неинтересно мало написал даже не хочется читать онлайн читать короче мы поняли что на самом деле нет никакого смысла вязать ряды мест и cd или operations прочего поэтому на сегодня я считаю что вот эта штука завершена вслед попробуем может быть если я на самом

    00:32:33 - 00:34:32

  • деле было открытием что в якобы чем кришна не только использует когда может хочется армейская что кажется тоже можно но нет ты же можешь отменить я только до того как она началась если она уже началась принимать так вопросы по сути дела gcd это такой большой менеджер экзекутора так почти дней вот и получается в итоге если смотрите на тех покрыты да мы можем в принципе теоретически создать ситуацию когда у нас все очереди будут забиты и какая то потенциальная задача будет долго чего-то ждать обэп можно for снова

    00:33:43 - 00:35:09

  • выполнить тут вот уже такие вопросы возникают смотря сколько у тебя задача смотря сколько ты запускаешь там можно еще настраивать на самом заливаем можно priority арестовать людей то есть очереди самый не globo воспользуюсь что можно приучать выставлять оставлять но все в итоге короче говоря упирается в аппаратную виртуализацию я der neue вот здесь вот возникает как раз таки такая фигня когда можно получить лаги или что-нибудь еще в этом как бы на все это я не знаю зачем вообще поддерживать ну типа те же самые 6s нахуя в 2020 уже

    00:34:35 - 00:36:37

  • году зачем поддерживать iphone 6s когда можно не поддерживать такое поддерживать 2 нет я знаю что такое поддерживается android мне кажется это вообще жесть какая-то на с китайцем прочими трэш у нас то хотя бы есть абсолютно четкий список девайсов и мы знаем когда выйдет следующий но плен в андроиде там же полный и невозможно войскам не комната реально но они не знают о чем до сих пор поддерживается этим маленьким экраном блин прикольно прикольно ладно короче всем спасибо приступаем к пьянке всем

    00:35:36 - 00:37:37

  • присутствовавшим тоже большое спасибо пока-пока

    00:36:42 - 00:36:50