avatar habrahabr_full

Хабрахабр без ката



подробнее...

Следить за персональным блогом

Автоматизированная система Промышленная безопасность и охрана труда

Обновления главной ленты блогов
Внимание

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

08 марта 2014, 12:10

[Из песочницы] Лучший мир с ReactiveCocoa


Большинство приложений тратят много времени на ожидание событий и их обработку. Они ожидают взаимодействия пользователя с интерфейсом. Ожидают ответа на сетевой запрос. Ожидают завершения асинхронных операций. Ждут изменения зависимого значения. И только потом они реагируют.

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

Именно поэтому мы решили сделать общедоступной часть волшебства, стоящей за GitHub for Mac: ReactiveCocoa (RAC). RAC — это framework для компановки и преобразования последовательностей значений.


Что же это на самом деле?


Давайте конкретизируем. ReactiveCocoa предоставляет множество интересных возможностей:

  1. Возможность составлять операции над будущими данными.
  2. Способ уменшения количества состояний и мутабельности.
  3. Декларативный способ определения поведений и взаимосвязей между свойствами.
  4. Унифицированный, высокоуровневый интерфейс для асинхронных операций.
  5. Прекрасное 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/


Другие новости по теме:


Новости по теме

7 декабря 2014 г., 1:52:30

Пока Google планомерно наращивает функциональность приложения Google Maps, компания из Купертино занимается доведением до ума собственного картографического сервиса, вызвавшего массу нареканий и даже заставившего главу Apple Тима Кука публично...

6 декабря 2014 г., 5:58:24

Сегодня хакеры из TaiG выпустили обновление для своей утилиты для джейлбрейка iOS 8.1.1 и iOS 8.2 beta под номером TaiG 1.1. Новая версия содержит исправления для некоторых багов и рекомендуется к установке всем пользователям. Для обновления на...

5 декабря 2014 г., 18:03:10

Квартальный отчет аналитической компании Strategy Analytics показал, что по результатам третьего квартала 2014 года Apple возглавила список производителей смартфонов с поддержкой LTE. Южнокорейские производители Samsung и LG занимают следующие строчк...

5 декабря 2014 г., 17:52:21

В этом году Apple и Google представили собственные решения для современных автомобилей. Сервисы получили названия CarPlay и Android Auto. О каждом из решений мы уже рассказывали, но в ролике ниже эксперт сравнивает функционал платформ на примере...

5 декабря 2014 г., 11:40:50

Вряд ли я кого-то удивлю, сообщив о том, что в Apple работают над несколькими моделями iPhone, чтобы представить их в следующем году. Но, кажется, их количество и параметры могут стать сюрпризом. Китайский ресурс Feng сообщает, что во второй половине...

5 декабря 2014 г., 11:38:35

Компания Huawei объявила, что больше не планирует выпускать смартфоны под управлением операционной системы Windows Phone. Напомним, у компании есть пара моделей на базе этой платформы, однако, заработать на их продажах не удалось. Об этом рассказал...

5 декабря 2014 г., 9:21:45

Спустя где-то неделю после выхода рекламы от Microsoft, в которой уже традиционно высмеивалась Siri, а также через несколько дней после релиза двух собственных рекламных роликов, уже традиционно озвученных Джимми Фэлоном и Джастином Тимберлейком,...

5 декабря 2014 г., 7:17:23

Согласно логике Apple, ее следующим смартфоном станет iPhone 6S, чуть улучшенная версия шестого «яблокофона», который на днях существенно подорожал в нашей стране. Однако дизайнер под ником Xerix93 смотрит в далекое будущее и видит, как выглядит...

5 декабря 2014 г., 1:26:54

HPC.ru для КПК. Компания Apple занимается разработкой очередного планшета серии iPad — iPad Air Plus, гигантского 12,2-дюймового таблета, над которым Apple, по слухам, работал в течение текущего года. Как вы, наверное, знаете, ребята из Купертино...

5 декабря 2014 г., 1:26:47

Apple iPhone 6 Plus cтавит рекорды продаж. Если верить последним заявлениям азиатских источников, ребята из Купертино в данный момент планируют добавить еще одну модель к линейке iPhone 6 и iPhone 6 Plus. По данным некоторых источников, в 2015 году...

5 декабря 2014 г., 1:24:30

Согласно логике Apple, ее следующим смартфоном станет iPhone 6S, чуть улучшенная версия шестого «яблокофона», который на днях существенно подорожал в нашей стране. Однако дизайнер под ником Xerix93 смотрит в далекое будущее и видит, как выглядит...

4 декабря 2014 г., 21:59:33

Куда же без носимой электроники современному человеку! Когда шестидюймовые «гигантофоны» не помещаются в карманы, на помощь приходят «умные» аксессуары: в первую очередь часы и браслеты, которые заменили фитнес-трекеры, медленно вытесняя их с рынка...

4 декабря 2014 г., 21:58:24

[04.12.2014] Apple ожидает рекордный 4 квартал. В странах Европы в 3-м квартале 2014 года рост доли iOS-устройств относительно аналогичного периода прошлого года составил 5.9% (общий рост соответствует 20.7%). Доля Apple на рынках крупных европейских...

4 декабря 2014 г., 21:55:41

Домашние телефоны стандарта DECT в данное время не так востребованы. Мобильная связь дешева, как никогда, а смартфоны догоняют по мощности прошлогодние ноутбуки. В Panasonic видели тренд издалека и ломали голову над сложнейшим вопросом. Как оживить...

4 декабря 2014 г., 21:25:52

Доля Apple на рынках крупных европейских стран выросла на фоне запуска iPhone 6 и iPhone 6 Plus. Об этом говорится в исследовании компании Kantar Worldpanel. Доля iOS-устройств на рынках крупнейших западноевропейских стран (Великобритания, Германия,...


Обзоры по теме

21 января 2015 г., 1:17:15 Главный конкурент iPad Air — Обзор планшета iPad mini с дисплеем Retina. Рис.1

Дизайн Дисплей Процессор и время работы Операционная система Камера и беспроводная связь 4G LTE Заключение В мире Apple слово «mini» долгое время означало миниатюрную, бюджетную, и потому более скромную версию продукта. Например, у Mac mini до...

17 января 2015 г., 11:57:03

Компания Apple в 2014 году представила два новых iPad, в этом материале мы делаем сравнительный обзор этих двух планшетов, чтобы помочь вам сделать правильный выбор. 2014 год в компании Apple – однозначно год iPhone, больше всего внимания было уделен...

16 января 2015 г., 10:43:55

Главным козырем джейлбрейка является полная свобода действий и возможность все переделать под себя. Не нравится стандартный менеджер звонков, камера, диспетчер файлов или браузер — поменяй их на другие или добавь новые опции, благо что в Cydia...

30 декабря 2014 г., 2:17:42 galaxy-alpha

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

26 декабря 2014 г., 22:04:25

​Мы пообщались с создателем проекта appflow, Денисом Неким. Тема беседы – новый сервис FewReview, с помощью которого разработчики и паблишеры могут в автоматическом режиме проводить кампании по постингу отзывов в маркеты приложений GooglePlay и...

22 декабря 2014 г., 20:58:59 Samsung Gear Live

Samsung Gear Live — попали к нам не так быстро, как хотелось бы. В продажу они поступили давно. И на сегодняшний момент пользуются хорошим спросом среди тех, кто любит мобильность и, в частности, технику от компании Samsung. Часы интересные, со своим...

16 декабря 2014 г., 19:27:25

Компания Wargaming наконец-то выкатила из студийных ангаров глобальную версию Blitz для Android-устройств. Редакция Droider мгновенно отреагировала на сие важное событие и сделала подробный обзор танкового экшна под номером один. В World of Tanks...

15 декабря 2014 г., 14:13:23

Nokia Lumia 830 лишь немногим уступает топовой модели Lumia 930. Аппараты похожи даже внешне, а вот стоит Lumia 830 ощутимо дешевле своей старшей соседки по линейке. Характеристики: Стандарт: GSM/WCDMA/LTE (nano-SIM) Операционная система: Windows...

15 декабря 2014 г., 6:19:32

Совсем недавно компания Huawei показала интересный аксессуар, который представляет из себя уникальную комбинацию умного фитнес-браслета и Bluetooth-гарнитуры. Нам удалось на некоторое время заполучить это устройство и провести его полноценное...

13 декабря 2014 г., 22:34:47 unpacked public Обзор: лучшие смартфоны, планшеты и аксессуары на IFA 2014

Крупнейшие производители мобильных устройств провели свои презентации на IFA-2014. Пресса имела свободный доступ на территорию IFA до того, как выставка стала открытой для широкой общественности. Фактически двери все еще открыты, но многие...


Инструкции по теме

3 февраля 2015 г., 15:12:52

Всем доброе утро! Сегодня понедельник, а значит самое время подвести итоги прошедшей недели. У нас вышло достаточно много интересных материалов: авторские статьи, обзоры, новости, появилась очень полезная и интересная рубрика про кастомные ядра андроид. Что касается новостей, то интересных было мало.Тем...

3 февраля 2015 г., 7:48:48 Вышла iOS 8.2 beta 5 (Скачать)

Apple продолжает активно работать над своей мобильной операционной системой. Несколько минут назад в разделе для разработчиков появилась пятая бета-версия прошивки iOS 8.2. Идет она под кодом 12D5480a (прошлая iOS 8.2 beta 4 была 12D5461b) и пока про изменения, которые нас в ней ждут, неизвестно...

3 февраля 2015 г., 4:28:45 skachat-ios-8-2-beta-5-dlya-iphone-ipad-i-ipod-touch

Американская компания Apple продолжает выпускать тестовые версии мобильной прошивки для разработчиков в преддверии запуска Apple Watch. Сегодня вышла пятая по счету бета-версия прошивки iOS 8.2. Скачать iOS 8.2 beta 5 могут только те пользователи, кто имеет официально зарегистрированный аккаунт разработчика. iOS...

2 февраля 2015 г., 0:03:43 image

В прошлую пятницу BSH Bosch und Siemens Hausgerate объявили о создании приложения, которое сможет контролировать все бытовые приборы в доме. Его название Home Connect, а отличительной особенностью станет то, что оно сможет контролировать приборы разных брендов и компаний. Bosch сказали, что данное приложение...

1 февраля 2015 г., 20:48:54 update-4

На устройствах с операционной системой iOS предусмотрена возможность обновления операторских настроек. Процедура может выполняться как полностью автоматически, так и в ручном режиме. Настройки оператора — это небольшие файлы, которые содержат параметры от компании Apple и провайдера сотовых услуг, в...

31 января 2015 г., 13:34:23 apple-vypustila-beta-versii-ios-8-1-1-i-os-x-yosemite-10-10-1

Сегодня «яблочная» корпорация выпустила в свет финальную версии платформы OS X Yosemite 10.10.1, сделав ее доступной для загрузки в Mac App Store. Обновленная прошивка получила несколько довольно важных изменений и доработок. Среди нововведений стоит упомянуть повышенную надежность Wi-Fi, а также более...

31 января 2015 г., 6:34:54 Акции Apple установили очередной рекорд

Минувший квартал был на редкость удачным для Apple, и это не замедлило сказаться на стоимости акций компании. Сегодня стоимость одной акции Apple установила очередной рекорд, преодолев отметку в $120. Это максимальное значение за всю историю, в последний раз стоимость акций достигла максимума в ноябре...

30 января 2015 г., 23:50:07 ios-8022

24 сентября Apple выпустила новую версию мобильной операционной системы iOS 8.0.1, из-за которой множество пользователей столкнулось с проблемами в работе iPhone 6, 6 Plus и некоторых других моделей «яблочных» смартфонов. Разработчикам Apple пришлось в кратчайшие сроки исправлять данную ситуацию, и через...

30 января 2015 г., 20:06:57 faq-kak-skryit-otklyuchit-panel-prediktivnogo-vvoda-teksta-na-vashem-iphone

Мобильное программное обеспечение iOS 8 принесло немало изменений для пользователей «яблочных» устройств, среди которых появилась поддержка предиктивного ввода текста. Суть его заключается в том, что система пытается предугадать ваши слова раньше, чем вы их наберете на основе вашего прошлого опыта печати. Если...

30 января 2015 г., 11:32:13

Сейчас, когда во многих регионах России в любой момент могут отключить тот или иной популярный интернет-сервис, VPN приобретает особую популярность. Однако далеко не все пользователи знают, что же это такое и как зашифровать свое подключение на iPhone или iPad. А ведь иногда это бывает просто необходимо. Для...


Комментарии (0)


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