Комментарии 21
Спасибо за статью, очень полезная информация.
Спасибо — позновательно
Да, после C# или Python конечно лямбды выглядят сильно мудреными. Если в C# для функции обратного вызова я буду писать лямбду, то в Objective-C я пока лучше по старинке с селектором, чтобы не мудрить с памятью. Хотя может дело привычки.
В любом случае хотя бы map в массиве уже отличный плюс. Джавистам о таком только мечтать)
В любом случае хотя бы map в массиве уже отличный плюс. Джавистам о таком только мечтать)
Исправьте слово «Сожержание» в начале статьи
Мерзковатое оформления кода.
Может что посоветуешь получше чем Source Code Highlighter, был бы очень благодарен.
Чего-то я не очень понял преимущество блоков, ибо первый же пример не рабочий…
warning: 'NSArray' may not respond to '-map:'
NSArray* stringsLengths( NSArray* strings_ )
{
return [ strings_ map: ^( id string_ )
{
return (id)[ NSNumber numberWithUnsignedInt: [ string_ length ] ];
} ];
}
* This source code was highlighted with Source Code Highlighter.
warning: 'NSArray' may not respond to '-map:'
я кажется понял — вы рекомендуете подключить внешнюю библиотеку, чтобы код работал. Ну тогда очевидно что сравнение не корректно, ибо решение 1 не использузет никаких внешних библиотек, а решение 2 использует. Сделать решение 1 более «элегантно» но чтобы оно использовало внешнюю библиотеку (без блоков) вполне себе возмоножно.
Т.е. аргумент
Топик плюсанул ибо он наконец мне помог понять мне что блоки мне совсем не нужны.
Т.е. аргумент
Но использование блоков имеет не мало преимуществ, и первое из них — существенная экономия на количестве кода,не состоятелен (код был вынесен во внешнюю библиотеку). Впрочем продолжение
а следовательно и на времени написания и поддержке.Очень сомнительно — ибо лучше 10 строк чистого для понимания кода против одной строчки в которой черт ногу сломит…
Топик плюсанул ибо он наконец мне помог понять мне что блоки мне совсем не нужны.
Поддерживаю жуткую нечитаемость кода. Хотя, возможно, это дело привычки.
аргумент: «существенная экономия на количестве кода» — не состоятелен (код был вынесен во внешнюю библиотеку).
Метод map: пишется один раз, использовать можно множество раз, тут и экономия. В моем проекте map: встречается 44 раза
Очень сомнительно — ибо лучше 10 строк чистого для понимания кода против одной строчки в которой черт ногу сломит…
Имя метода map: выбрано не случайно, метод map: с аналогичным поведением встечается фактически во всех языках программирования и многим, включая меня проще читать map: вместо 10 строчек кода.
Топик плюсанул ибо он наконец мне помог понять мне что блоки мне совсем не нужны.
Полагаю что с блоками придется ознакомится всем IOS разработчикам ибо многое новое апи IOS SDK идет c использованием блоков, без альтернативы с селекторами. Пример
> Метод map: пишется один раз
Ну так и без блоков этот метод написать один раз легко — что мешает использовать не блок а указатель на функцию коли хочется параметром код передавать?
одно дело использовать по необходимости когда альтернатив нет, другое дело сознательно. Я тоже как ни странно делал код с блоками — надо было проверить не расширит ли возможности такой вариант работы с акселерометром. Не расширил. А вот код стал более громоздким — это точно. Хотя конечно — на вкус и цвет все фломастеры разные :)
Ну так и без блоков этот метод написать один раз легко — что мешает использовать не блок а указатель на функцию коли хочется параметром код передавать?
одно дело использовать по необходимости когда альтернатив нет, другое дело сознательно. Я тоже как ни странно делал код с блоками — надо было проверить не расширит ли возможности такой вариант работы с акселерометром. Не расширил. А вот код стал более громоздким — это точно. Хотя конечно — на вкус и цвет все фломастеры разные :)
Топик плюсанул ибо он наконец мне помог понять мне что блоки мне совсем не нужны.
Вам следует срочно прочитать уже успевшие стать «старой классикой» мануалы «Grand Central Dispatch (GCD) Reference» и «Concurrency Programming Guide». А то вдруг где в разговоре всплывает, как сейчас — люди не поймут же. Это по сути сейчас основы и писать код без использования подобных бустов — это, простите, но писать говнокод.
не прощу. Мануалы, что вы порекомендовали — относятся к iOS4 и выше — т.е. весь код что написан до iOS 4 — говнокод? ну-ну.
Нет конечно, уверен что хороший код, но продолжать отказываться от них сейчас — это действительно неблагоразумно.
Кстати на самом деле блоки в мак тусовке активно муссировались задолго до официального выхода (10.6 и iOS 4), Apple сама их начала пытаться продвинуть как стандарт еще в 2008 году, а поскольку все сурсы открыты, то почти сразу же был отпочкован проект plblocks который позволял насладится ими и в леопарде, ну и в первых версиях iOS (не уверен, ибо не пишу под iOS, но вроде как еще с 2 версии).
Ну а после уже официального представления прошел же целый год, за это время блоки и gcd действительно стали неотъемлемой частью практически любой программы. Если спросить меня что самое запоминающееся появилось у Apple за последние несколько лет, я назову именно gcd и блоки.
Кстати на самом деле блоки в мак тусовке активно муссировались задолго до официального выхода (10.6 и iOS 4), Apple сама их начала пытаться продвинуть как стандарт еще в 2008 году, а поскольку все сурсы открыты, то почти сразу же был отпочкован проект plblocks который позволял насладится ими и в леопарде, ну и в первых версиях iOS (не уверен, ибо не пишу под iOS, но вроде как еще с 2 версии).
Ну а после уже официального представления прошел же целый год, за это время блоки и gcd действительно стали неотъемлемой частью практически любой программы. Если спросить меня что самое запоминающееся появилось у Apple за последние несколько лет, я назову именно gcd и блоки.
Немного с вами не согласен. Блоки, возможно, и не панацея, однако при работе с теми же интерфейсами зачастую просто не нравится определять половину логики в одном методе, половину в другом.
Я имею ввиду, например, UIAlertView — ради зачастую пары строк, обрабатывающих действия по выбору пользователя, приходилось заводить новый метод + еще и определять, от какого из UIAlertView (если их несколько) мы пришли…
Я имею ввиду, например, UIAlertView — ради зачастую пары строк, обрабатывающих действия по выбору пользователя, приходилось заводить новый метод + еще и определять, от какого из UIAlertView (если их несколько) мы пришли…
хотелось бы еще добавить, что при объявлении и реализации блока очень помогает набрать inlineBlock и получить такой хинт:
<#Return Type#>(^<#Block Name#>)(<#Parameter Types#>) = ^(<#Parameters#>) {
<#Code#>
};
<#Return Type#>(^<#Block Name#>)(<#Parameter Types#>) = ^(<#Parameters#>) {
<#Code#>
};
Насчет блоков для UIAlertView есть хорошая надстройка от Mugunth Kumar — MKBlockAdditions
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
О блоках и их использовании в Objective-C часть 2-ая