Большинство приложений тратят много времени на ожидание событий и их обработку. Они ожидают взаимодействия пользователя с интерфейсом. Ожидают ответа на сетевой запрос. Ожидают завершения асинхронных операций. Ждут изменения зависимого значения. И только потом они реагируют.
Все эти ожидания и реакции можно реализовать большим количеством способов. Нам становится трудно рассуждать о них, связывать и создавать в любой высокоуровневой форме. Но мы можем сделать лучше.
Именно поэтому мы решили сделать общедоступной часть волшебства, стоящей за GitHub for Mac: ReactiveCocoa (RAC). RAC — это framework для компановки и преобразования последовательностей значений.
Что же это на самом деле?
Давайте конкретизируем. ReactiveCocoa предоставляет множество интересных возможностей:
- Возможность составлять операции над будущими данными.
- Способ уменшения количества состояний и мутабельности.
- Декларативный способ определения поведений и взаимосвязей между свойствами.
- Унифицированный, высокоуровневый интерфейс для асинхронных операций.
- Прекрасное API, основанное на KVO.
Все это может казаться немного хаотичным до того, пока вы не осознаете, что RAC предназначен для тех ситуаций, где вы ожидаете какое-то новое значение, а затем реагируете на его изменение.
Настоящая красота RAC в том, что он может приспосабливаться к различным, часто встречающимся ситуациям.
Хватит разговоров. Давайте посмотрим как это выглядит на самом деле.
Примеры
RAC, используя KVO, может предоставлять последовательность значений из KVO-совместимых свойств. Например, мы можем наблюдать за изменениями свойства username:
[RACObserve(self, username) subscribeNext:^(NSString *newName) {
NSLog(@"%@", newName);
}];
Это круто, но это не более чем хорошее API над KVO. Действительно интересные вещи происходят, когда мы объединяем последовательности для выражения сложного поведения.
Предположим, мы хотим проверить ввел ли пользователь уникальное имя, но только с первых трех попыток:
[[[[RACObserve(self, username)
distinctUntilChanged]
take:3]
filter:^(NSString *newUsername) {
return [newUsername isEqualToString:@"joshaber"];
}]
subscribeNext:^(id _) {
NSLog(@"Hi me!");
}];
Мы наблюдаем за изменением username, отсеиваем несущественные изменения, берем только первые три значения, а затем, если новое значение равно joshaber, мы выводим особое приветствие.
И что?
Подумайте о том, что нам пришлось бы сделать, чтобы выполнить это без RAC. А именно:
- Использовать KVO, чтобы добавить наблюдателя за username.
- Добавить свойство для запоминания последнего значения, полученного с помощью KVO, благодаря чему мы сможем игнорировать несущественные изменения.
- Добавить свойство для подсчета количества полученных уникальных значений.
- Увеличивать это свойство каждый раз, когда мы получаем уникальное значение.
- И наконец перейти к сравнению.
RAC позваляет нам делать то же самое с меньшим количеством состояний, меньшим количеством шаблонного кода, лучшей локализованостью кода и с более четким выражением наших намеренней.
Что еще?
Мы можем комбинировать последовательности:
[[RACSignal
combineLatest:@[RACObserve(self, password), RACObserve(self, passwordConfirmation)]
reduce:^id(NSString *currentPassword, NSString *currentConfirmPassword) {
return [NSNumber numberWithBool:[currentConfirmPassword isEqualToString:currentPassword]];
}]
subscribeNext:^(NSNumber *passwordsMatch) {
self.createEnabled = [passwordsMatch boolValue];
}];
Каждый раз, когда свойства password или passwordConfirmation меняются, мы объеденяем два их последних значения и приводим их к BOOL, чтобы проверить совпадают ли они. Затем мы активируем или деактивируем кнопку create, используя полученный результат.
Связи
Мы можем применять RAC для получения мощных связей с условиями и трансформациями:
RAC(self, helpLabel.text) = [[RACObserve(self, help)
filter:^(NSString *newHelp) {
return newHelp != nil;
}]
map:^(NSString *newHelp) {
return [newHelp uppercaseString];
}];
Это связывает текст нашего help label’a к help свойству, если help свойство не nil, и после этого переводит строку в верхний регистр (потому что пользователям нравится, когда на них ОРУТ).
Асинхронность
RAC также довольно хорошо согласуется с асинхронными операциями.
Например, мы можем вызвать блок, как только несколько параллельных операций будут выполнены:
[[RACSignal
merge:@[ [client fetchUserRepos], [client fetchOrgRepos] ]]
subscribeCompleted:^{
NSLog(@"They're both done!");
}];
Или связать асинхронные операции:
[[[[client
loginUser]
flattenMap:^(id _) {
return [client loadCachedMessages];
}]
flattenMap:^(id _) {
return [client fetchMessages];
}]
subscribeCompleted:^{
NSLog(@"Fetched all messages.");
}];
Это авторизирует нас, получает кешированные сообщения, загружает сообщения с сервера и после выведет “Fetched all messages.”.
Мы так же достаточно просто можем перенести работу в фоновую очередь:
[[[[[client
fetchUserWithUsername:@"joshaber"]
deliverOn:[RACScheduler scheduler]]
map:^(User *user) {
// this is on a background queue
return [[NSImage alloc] initWithContentsOfURL:user.avatarURL];
}]
deliverOn:RACScheduler.mainThreadScheduler]
subscribeNext:^(NSImage *image) {
// now we're back on the main queue
self.imageView.image = image;
}];
Или справиться с потенциальным условиями перехвата.
Например, мы можем обновить свойство результатом любого асинхронного вызова, но только если оно не было изменено до его завершения:
[[[self
loadDefaultMessageInBackground]
takeUntil:[RACObserve(self.message) skip:1]]
toProperty:@keypath(self.message) onObject:self];
Как это работает?
RAC довольно прост. Он весь состоит из сигналов.
Подписчики подписаны на сигналы. Сигналы отправляют своим подписчикам next, error, и completed события. И если это всего лишь сигналы, отправляющие события, ключевым вопросом становиться: когда же эти события отправляются?
Создание сигналов
Сигналы определяют свое поведение относительно того когда и в связи с чем отправлются события. Мы можем создать свой собственный сигнал, используя +[RACSignal createSignal:]:
RACSignal *helloWorld = [RACSignal createSignal:^(id<RACSubscriber> subscriber) {
[subscriber sendNext:@"Hello, "];
[subscriber sendNext:@"world!"];
[subscriber sendCompleted];
return nil;
}];
Блок, что мы передаем в +[RACSignal createSignal:], вызывается каждый раз, когда сигнал получает нового подписчика. Новый подписчик подставляется в блок и, таким образом, мы можем отправлять ему события. В примере выше мы создали сигнал, который отправляет “Hello, ”, потом “world!”, и после этого завершается.
Вложенные сигналы
Мы также можем создать другой сигнал, основанный на нашем helloWorld сигнале:
RACSignal *joiner = [RACSignal createSignal:^(id<RACSubscriber> subscriber) {
NSMutableArray *strings = [NSMutableArray array];
return [helloWorld subscribeNext:^(NSString *x) {
[strings addObject:x];
} error:^(NSError *error) {
[subscriber sendError:error];
} completed:^{
[subscriber sendNext:[strings componentsJoinedByString:@""]];
[subscriber sendCompleted];
}];
}];
Теперь у нас есть сигнал joiner. Когда кто-то подписывается на joiner, он автоматически подписывается на сигнал helloWorld. Joiner добавляет все значения, полученные из helloWorld и потом, когда helloWorld завершается, он объединяет все полученные строки в единственную строку, отправляет ее и завершается.
Таким образом, мы можем создавать сигналы, основанные друг на друге, для выражения сложного поведения.
RAC включает в себя набор операций над RACSignal, которые именно этим и занимаются. Они принимают исходный сигнал, возвращая новый сигнал с некоторым определенным поведением.
Дополнительная информация
ReactiveCocoa работает как на Mac, так и на iOS. Для получения дополнительной информации Вы можете ознакомится с README, а так же с документацией, которую вы сможете найти в проекте ReactiveCocoa.
Для .NET разработчиков все это может показаться очень знакомым. ReactiveCocoa, на самом деле, Objective-C версия Reactive Extensions (Rx) для .NET.
Многие принципы Rx применимы и для RAC. Вот несколько действительно хороших источников о Rx:
Reactive Extensions MSDN entry
Reactive Extensions for .NET Introduction
Rx — Channel 9 videos
Reactive Extensions wiki
101 Rx Samples
Programming Reactive Extensions and LINQ
Перевод публикуется с согласия автора оригинальной статьи и данного framework'а Josh Abernathy.
Источник: http://habrahabr.ru/post/215033/
Другие новости по теме:
Новости по теме
Карты для Apple будут создавать пользователи iPhone и iPad7 декабря 2014 г., 1:52:30Пока Google планомерно наращивает функциональность приложения Google Maps, компания из Купертино занимается доведением до ума собственного картографического сервиса, вызвавшего массу нареканий и даже заставившего главу Apple Тима Кука публично... |
Вышла новая версия джейлбрейка TaiG 1.16 декабря 2014 г., 5:58:24Сегодня хакеры из TaiG выпустили обновление для своей утилиты для джейлбрейка iOS 8.1.1 и iOS 8.2 beta под номером TaiG 1.1. Новая версия содержит исправления для некоторых багов и рекомендуется к установке всем пользователям. Для обновления на... |
Apple - лидер сегмента LTE-фонов, OPPO и Vivo - в ТОП-55 декабря 2014 г., 18:03:10Квартальный отчет аналитической компании Strategy Analytics показал, что по результатам третьего квартала 2014 года Apple возглавила список производителей смартфонов с поддержкой LTE. Южнокорейские производители Samsung и LG занимают следующие строчк... |
Видео-сравнение Android Auto и CarPlay на примере нового авто Hyundai5 декабря 2014 г., 17:52:21В этом году Apple и Google представили собственные решения для современных автомобилей. Сервисы получили названия CarPlay и Android Auto. О каждом из решений мы уже рассказывали, но в ролике ниже эксперт сравнивает функционал платформ на примере... |
[Слух] Apple выпустит новый 4-дюймовый iPhone в 2015 году5 декабря 2014 г., 11:40:50Вряд ли я кого-то удивлю, сообщив о том, что в Apple работают над несколькими моделями iPhone, чтобы представить их в следующем году. Но, кажется, их количество и параметры могут стать сюрпризом. Китайский ресурс Feng сообщает, что во второй половине... |
Huawei отказывается от Windows Phone5 декабря 2014 г., 11:38:35Компания Huawei объявила, что больше не планирует выпускать смартфоны под управлением операционной системы Windows Phone. Напомним, у компании есть пара моделей на базе этой платформы, однако, заработать на их продажах не удалось. Об этом рассказал... |
Apple выпустила еще одну рекламу iPhone 6 и iPhone 6 Plus5 декабря 2014 г., 9:21:45Спустя где-то неделю после выхода рекламы от Microsoft, в которой уже традиционно высмеивалась Siri, а также через несколько дней после релиза двух собственных рекламных роликов, уже традиционно озвученных Джимми Фэлоном и Джастином Тимберлейком,... |
Дизайн Apple iPhone 7 вернется к истокам5 декабря 2014 г., 7:17:23Согласно логике Apple, ее следующим смартфоном станет iPhone 6S, чуть улучшенная версия шестого «яблокофона», который на днях существенно подорожал в нашей стране. Однако дизайнер под ником Xerix93 смотрит в далекое будущее и видит, как выглядит... |
Макет iPad Air Plus сравнили с другими устройствами Apple5 декабря 2014 г., 1:26:54HPC.ru для КПК. Компания Apple занимается разработкой очередного планшета серии iPad — iPad Air Plus, гигантского 12,2-дюймового таблета, над которым Apple, по слухам, работал в течение текущего года. Как вы, наверное, знаете, ребята из Купертино... |
В 2015 году Apple может выпустить новый iPhone с 4-дюймовым экраном5 декабря 2014 г., 1:26:47Apple iPhone 6 Plus cтавит рекорды продаж. Если верить последним заявлениям азиатских источников, ребята из Купертино в данный момент планируют добавить еще одну модель к линейке iPhone 6 и iPhone 6 Plus. По данным некоторых источников, в 2015 году... |
Дизайн Apple iPhone 7 вернется к истокам5 декабря 2014 г., 1:24:30Согласно логике Apple, ее следующим смартфоном станет iPhone 6S, чуть улучшенная версия шестого «яблокофона», который на днях существенно подорожал в нашей стране. Однако дизайнер под ником Xerix93 смотрит в далекое будущее и видит, как выглядит... |
Обзор Huawei Talkband B1. Два в одном: Bluetooth-гарнитура и фитнес-трекер4 декабря 2014 г., 21:59:33Куда же без носимой электроники современному человеку! Когда шестидюймовые «гигантофоны» не помещаются в карманы, на помощь приходят «умные» аксессуары: в первую очередь часы и браслеты, которые заменили фитнес-трекеры, медленно вытесняя их с рынка... |
Apple тестирует новую рекламу iPhone 6 и iPhone 6 Plus4 декабря 2014 г., 21:58:24[04.12.2014] Apple ожидает рекордный 4 квартал. В странах Европы в 3-м квартале 2014 года рост доли iOS-устройств относительно аналогичного периода прошлого года составил 5.9% (общий рост соответствует 20.7%). Доля Apple на рынках крупных европейских... |
Обзор домашнего телефона Panasonic KX-PRL260. Гарнитура, пульт, колонка и док-станция для iPhone4 декабря 2014 г., 21:55:41Домашние телефоны стандарта DECT в данное время не так востребованы. Мобильная связь дешева, как никогда, а смартфоны догоняют по мощности прошлогодние ноутбуки. В Panasonic видели тренд издалека и ломали голову над сложнейшим вопросом. Как оживить... |
Запуск iPhone 6 повысил проникновение устройств Apple на европейский рынок смартфонов4 декабря 2014 г., 21:25:52Доля Apple на рынках крупных европейских стран выросла на фоне запуска iPhone 6 и iPhone 6 Plus. Об этом говорится в исследовании компании Kantar Worldpanel. Доля iOS-устройств на рынках крупнейших западноевропейских стран (Великобритания, Германия,... |
Обзоры по теме
Главный конкурент iPad Air — Обзор планшета iPad mini с дисплеем Retina21 января 2015 г., 1:17:15
Дизайн Дисплей Процессор и время работы Операционная система Камера и беспроводная связь 4G LTE Заключение В мире Apple слово «mini» долгое время означало миниатюрную, бюджетную, и потому более скромную версию продукта. Например, у Mac mini до... |
Сравнительный обзор iPad Air 2 и iPad mini 317 января 2015 г., 11:57:03Компания Apple в 2014 году представила два новых iPad, в этом материале мы делаем сравнительный обзор этих двух планшетов, чтобы помочь вам сделать правильный выбор. 2014 год в компании Apple – однозначно год iPhone, больше всего внимания было уделен... |
Альтернативная оболочка SphereView заменяет домашний экран iOS трехмерной сферой [Cydia]16 января 2015 г., 10:43:55Главным козырем джейлбрейка является полная свобода действий и возможность все переделать под себя. Не нравится стандартный менеджер звонков, камера, диспетчер файлов или браузер — поменяй их на другие или добавь новые опции, благо что в Cydia... |
Топ-10 лучших смартфонов 2014 года по версии ItReviewer.ru30 декабря 2014 г., 2:17:42
2014-й год показал, что если с технической точки зрения на рынке мобильных устройств все более-менее в порядке — девайсы становятся все мощнее, все функциональнее и вместе с тем изящнее, то с точки зрения смыслов, новых сценариев использования мы... |
Денис Некий (FewReview): «Всё работает очень просто и удобно»26 декабря 2014 г., 22:04:25Мы пообщались с создателем проекта appflow, Денисом Неким. Тема беседы – новый сервис FewReview, с помощью которого разработчики и паблишеры могут в автоматическом режиме проводить кампании по постингу отзывов в маркеты приложений GooglePlay и... |
Samsung Gear Live — обзор смарт-часов22 декабря 2014 г., 20:58:59
Samsung Gear Live — попали к нам не так быстро, как хотелось бы. В продажу они поступили давно. И на сегодняшний момент пользуются хорошим спросом среди тех, кто любит мобильность и, в частности, технику от компании Samsung. Часы интересные, со своим... |
[Видеообзор] Эпичный обзор World of Tanks Blitz16 декабря 2014 г., 19:27:25Компания Wargaming наконец-то выкатила из студийных ангаров глобальную версию Blitz для Android-устройств. Редакция Droider мгновенно отреагировала на сие важное событие и сделала подробный обзор танкового экшна под номером один. В World of Tanks... |
Выше среднего: обзор смартфона Nokia Lumia 83015 декабря 2014 г., 14:13:23Nokia Lumia 830 лишь немногим уступает топовой модели Lumia 930. Аппараты похожи даже внешне, а вот стоит Lumia 830 ощутимо дешевле своей старшей соседки по линейке. Характеристики: Стандарт: GSM/WCDMA/LTE (nano-SIM) Операционная система: Windows... |
Huawei TalkBand B1 – обзор браслета-гарнитуры15 декабря 2014 г., 6:19:32Совсем недавно компания Huawei показала интересный аксессуар, который представляет из себя уникальную комбинацию умного фитнес-браслета и Bluetooth-гарнитуры. Нам удалось на некоторое время заполучить это устройство и провести его полноценное... |
Обзор: лучшие смартфоны, планшеты и аксессуары на IFA 201413 декабря 2014 г., 22:34:47
Крупнейшие производители мобильных устройств провели свои презентации на IFA-2014. Пресса имела свободный доступ на территорию IFA до того, как выставка стала открытой для широкой общественности. Фактически двери все еще открыты, но многие... |
Инструкции по теме
Предыдущая неделя на Root-Nation: 26.01-1.02/20153 февраля 2015 г., 15:12:52Всем доброе утро! Сегодня понедельник, а значит самое время подвести итоги прошедшей недели. У нас вышло достаточно много интересных материалов: авторские статьи, обзоры, новости, появилась очень полезная и интересная рубрика про кастомные ядра андроид. Что касается новостей, то интересных было мало.Тем... |
Вышла iOS 8.2 beta 5 (Скачать)3 февраля 2015 г., 7:48:48
Apple продолжает активно работать над своей мобильной операционной системой. Несколько минут назад в разделе для разработчиков появилась пятая бета-версия прошивки iOS 8.2. Идет она под кодом 12D5480a (прошлая iOS 8.2 beta 4 была 12D5461b) и пока про изменения, которые нас в ней ждут, неизвестно... |
Скачать iOS 8.2 beta 5 для iPhone, iPad и iPod touch3 февраля 2015 г., 4:28:45
Американская компания Apple продолжает выпускать тестовые версии мобильной прошивки для разработчиков в преддверии запуска Apple Watch. Сегодня вышла пятая по счету бета-версия прошивки iOS 8.2. Скачать iOS 8.2 beta 5 могут только те пользователи, кто имеет официально зарегистрированный аккаунт разработчика. iOS... |
[recovery mode] Home Connect — одно приложение для всех брендов2 февраля 2015 г., 0:03:43
В прошлую пятницу BSH Bosch und Siemens Hausgerate объявили о создании приложения, которое сможет контролировать все бытовые приборы в доме. Его название Home Connect, а отличительной особенностью станет то, что оно сможет контролировать приборы разных брендов и компаний. Bosch сказали, что данное приложение... |
Как проверить и установить обновление настроек оператора на iPhone и iPad1 февраля 2015 г., 20:48:54
На устройствах с операционной системой iOS предусмотрена возможность обновления операторских настроек. Процедура может выполняться как полностью автоматически, так и в ручном режиме. Настройки оператора — это небольшие файлы, которые содержат параметры от компании Apple и провайдера сотовых услуг, в... |
Вышла финальная версия OS X Yosemite 10.10.1 и обновление прошивки iOS 8.1.131 января 2015 г., 13:34:23
Сегодня «яблочная» корпорация выпустила в свет финальную версии платформы OS X Yosemite 10.10.1, сделав ее доступной для загрузки в Mac App Store. Обновленная прошивка получила несколько довольно важных изменений и доработок. Среди нововведений стоит упомянуть повышенную надежность Wi-Fi, а также более... |
Акции Apple установили очередной рекорд31 января 2015 г., 6:34:54
Минувший квартал был на редкость удачным для Apple, и это не замедлило сказаться на стоимости акций компании. Сегодня стоимость одной акции Apple установила очередной рекорд, преодолев отметку в $120. Это максимальное значение за всю историю, в последний раз стоимость акций достигла максимума в ноябре... |
Вышла iOS 8.0.2, устраняющая многочисленные баги предыдущей версии прошивки30 января 2015 г., 23:50:07
24 сентября Apple выпустила новую версию мобильной операционной системы iOS 8.0.1, из-за которой множество пользователей столкнулось с проблемами в работе iPhone 6, 6 Plus и некоторых других моделей «яблочных» смартфонов. Разработчикам Apple пришлось в кратчайшие сроки исправлять данную ситуацию, и через... |
FAQ: как скрыть (отключить) панель предиктивного ввода текста на вашем iPhone30 января 2015 г., 20:06:57
Мобильное программное обеспечение iOS 8 принесло немало изменений для пользователей «яблочных» устройств, среди которых появилась поддержка предиктивного ввода текста. Суть его заключается в том, что система пытается предугадать ваши слова раньше, чем вы их наберете на основе вашего прошлого опыта печати. Если... |
Как установить VPN на iPhone или iPad?30 января 2015 г., 11:32:13Сейчас, когда во многих регионах России в любой момент могут отключить тот или иной популярный интернет-сервис, VPN приобретает особую популярность. Однако далеко не все пользователи знают, что же это такое и как зашифровать свое подключение на iPhone или iPad. А ведь иногда это бывает просто необходимо. Для... |
-
Ключевые слова:
- Функциональное программирование,
- Objective C,
- Разработка под iOS,
- objective-c,
- os x,
- reactivecocoa,
- iOS,
- functional programming,
- информационные технологии,
- блог,
- iOS



Комментарии (0)
Чтобы оставить комментарий, отзыв или написать пост о вашей отрасли, следует войти или зарегистрироваться, если у вас еще нет аккаунта.