Показаны сообщения с ярлыком ios. Показать все сообщения
Показаны сообщения с ярлыком ios. Показать все сообщения

2014-12-04

Callbacks vs promises

Добавил в текущий проект промисы. Для сравнения

До:
-(void) p_pluckHamsSinceLastPluckWithCompletion:(BarPluckHamsCompletion) completion
{
  NSDate * date = [NSUserDefaults standardUserDefaults].lastPluckDate;

  XXXHamPlucker plucker = ^(XXXPluckSession * session, XXXFoo *foo, XXXPluckConsumer consumer) {
    [session searchBoosSinceDate:date withFoo:foo completion:^(NSError *error, NSIndexSet * boos) {
      if (error)
        return consumer(error, nil);
      [Bar filterBoos:boos withFoo:foo completion:^(NSIndexSet *boos) {
        [session pluckHamsWithBoos:boos withFoo:foo completion:^(NSError * error, NSArray * hams) {
          if (error)
            return consumer(error, nil);
          [Bar filterHams:hams inFoo:foo completion:^(NSArray *hams) {
            consumer(nil, hams);
          }];
        }];
      }];
    }];
  };

  [self p_pluckHamsUsingPlucker:plucker completionHandler:completion];
}

После
-(XXXPromise *) p_pluckHamsSinceLastPluck {
  NSDate * date = [NSUserDefaults standardUserDefaults].lastPluckDate;

  XXXHamPlucker plucker = ^(XXXPluckSession * session, XXXFoo * foo) {
    XXXPromise * promise = [session searchBoosSinceDate:date withFoo:foo];
    return promise.thenPromise(^(NSIndexSet * boos){
      return [Bar filterBoos:boos withFoo:foo];
    }).thenPromise(^(NSIndexSet * boos){
      return [session pluckHamsWithBoos:boos withFoo:foo];
    }).thenPromise(^(NSArray * hams) {
      return [Bar filterHams:hams withFoo:foo];
    });
  };

  return [self p_pluckHamsUsing:plucker];
}

Промисы свои, написал часа за 3-4. Смотрел RXPromise и PromiseKit, но они не умеют то, что мне нужно.

2014-01-03

Яббл тоже страдает NIH-синдромом.

Собирал одну С-библиотеку. Как водится, 100500 предупреждений, которыми никто не парится.
Обратил внимание на ряд "XXX is deprecated, first deprecated in OS X 10.7".
Начал гуглить -- в 2011 они объявили "старое" криптоапи устаревшим (наверное, нашли в нем Фатальный Недостаток TM). Взамен рекомендуют CF-api с блекджеком и шл^W^W^W блоками и пайплайнингом операций. Причем оно доступно только в OS X, для iOS есть "CommonCrypto", почти совместимый с OpenSSL.
P.S. да, я слоупок :)

2012-08-31

Юнит-тесты и iOS.

Хотел в новом проекте под ios сделать все кошерно -- отделить логику от гуя, обложить логику юнит-тестами. Ага, щаз.
Вынес логику как статическую либу -- потерялись некоторые методы. Проект компилируется без ошибок, а в рантайме падает - Unrecognized Selector. Как оказалось, без флага -ObjC линкер не подтягивает категории (аналог extension methods из C#) из статических библиотек. Благо сотрудник уже с таким сталкивался, подсказал.
Начал пилить тесты. Инициализация MagicRecord (библиотека для active record) падает с исключением "URL is nil".  Не находит схему данных. Смотрю внутрь бандла теста - лежит. Оказалось, она пытается загрузить схему из ресурсов главного модуля. А для юнит-тестов главным модулем является программа otest из SDK.

Upd. Юнит-тесты поборол. Решение со StackOverflow:

Assuming you have an application target called "MyApp"
  1. Add a new target of type "other/Cocoa Unit Testing Bundle" to the project e.g "MyAppTesting". Here all Unit test files are located.
  2. Go to MyAppTesting Build Phases and add MyApp as Target Dependency. This assures that MyApp is build before building the MyAppTesting target.
  3. Open the Build Settings of MyAppTesting and change
    • Bundle Loader: $(BUILT_PRODUCTS_DIR)/MyApp.app/MyApp
    • Test host: $(BUNDLE_LOADER)
    That causes the tests to run within MyApp.
  4. Open the Build Settings of MyApp and change
    • Symbols Hidden by default: NO (for both)
    • Strip debug Symbols during Copy: Debug:NO
    By doing so you do not have to include every .m-file into the test target.

2012-05-10

Ruby+iOS

Нашел интересный проект: www.rubymotion.com

Компилятор (!) диалекта Ruby, построенного поверх ObjC runtime.
Теперь под iOS можно писать на нормальном языке с преферансом и гимназистками богатой стандартной библиотекой, лямбдами, DSL, REPL и другими нямками.
При этом оно понимает любые objc-фреймворки и позволяет почти прозрачно вызывать сишные функции.

Из минусов:
  1. хотят много денег ( $200 $150) 
  2. использует ARC, поэтому циклические ссылки не разруливает :