• Работа с геолокацией в iOS 24/7

    • Tutorial



    В последнее время, часто вижу вопрос:
    Можно ли в iOS работать с геолокацией, когда приложение свернули и отправлять данные на сервер?

    Это действительно возможно и совсем не сложно.
    How to вместится в превью статьи.

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


    Чтобы была какая-то конкретика, я предположил, что перед нами стоит задача написать вело-трекер. Со стороны пользователя это выглядит так:


    1. Скачиваю приложение
    2. Запускаю
    3. Регистрируюсь
    4. Нажимаю куда просят
    5. Закрываю
    6. Катаюсь
    7. Запускаю
    8. Вижу результат

    p.s. финальный код здесь.

    Любые совпадения с реально существующим приложением случайны
  • Внедрения реактива в архитектуру iOS приложений

    • Tutorial
    Большинство статей о функционально-реактивном программировании ограничиваются демонстрацией возможностей определенного инструмента в определенной задачи и не дают понимания как использовать всю мощь в рамках целого проекта.

    Хотелось бы поделиться опытом проектирования с использованием функционально-реактивного программирования под iOS. Это не зависит от выбранного инструмента, будь то RAC, RxSwift, Interstellar или же что-то еще. Так же это применимо при разработке под MacOS.

    В определенных моментах я буду писать, используя Swift + RAC4, поскольку это мои основные инструменты на данный момент. Однако, я не буду использовать в статье терминологию и особенности RAC4.

    Может быть вы зря отказывались от реактивного программирования и пора начать его использовать?
    Читать дальше →
    • +8
    • 11.5k
    • 6
  • Swift улучшаем performSegueWithIdentifier или удобный роутер со сторибордами

      Редкий разработчик под iOS или OS X не использовал сториборды и еще меньше программистов не передавали данные между экранами.
      Все мы знаем метод performSegueWithIdentifier и трудности работы с ним.

      Начав проект на Swift в один момент мне стало обидно: «Почему мы должны в строго-типизированном языке использовать обертку для передачи данных?»
      Через пару минут сформировалось видение решения и в скором времени реализация.

      Долго думал, стоит ли писать об этом, поскольку материал крайне небольшой, но эти 50 строк могут вам очень сильно помочь

      menuController?.performSegueWithIdentifier(changeItemIdentifier, sender: nil) { segue in
          let controller = segue.destinationViewController as! ChangeMenuItemController
          controller.viewModel.sourceMenuItem = item
      }
      


      Таким образом, легко использовать сториборды и роутеры вместе. Устранить разрастание prepareForSegue и увеличить контекст чтения кода. В то же время это не вынуждает отказываться от prepareForSegue при удобных ситуациях.

      Разберемся как это работает? Не претендую на уникальность, но мне кажется подход интересным.
      Читать дальше →
    • До чего доводит идея (Objective-C) — target-action на блоках и много рантайма

      • Tutorial
      Пришла мне как-то в голову идея, а можно ли взять блок и отдать для target-action?
      Есть готовые решения, как к примеру BlocksKit и другие библиотеки, однако их решение заключается в сохранении блока, установкой таргета и вызова блока из указанного селектора.

      Зачем тогда нужна эта статья?

      Я захотел создать способ генерации селектора, по которому будет вызван блок. Что здесь сложного, скажете вы? imp_implementationWithBlock + class_addMethod и дело закрыто. Но при этом подходе есть одно серьезное требование, это первый аргумент блока — владелец метода.

      Как обойти это требование и сделать такое?
          [button addTarget:self action:[self ax_lambda:^(UIButton *sender, UIEvent *event){
              NSLog(@"click on button %@, event = %@", sender, event);
          }] forControlEvents:UIControlEventTouchUpInside];
      
          [button addTarget:self action:[self ax_lambda:^{
              NSLog(@"click");
          }] forControlEvents:UIControlEventTouchUpInside];
      

      Или даже вот так
          __block NSInteger sum = 0;
          [self performSelector:[self ax_lambda:^(NSNumber *argA, NSNumber *argB) {
              sum = [argA integerValue] + [argB integerValue];
          }] withObject:@(2) withObject:@(3)];
          //sum — 5
      
          SEL selSum = [self ax_lambda:^NSInteger(NSInteger argA, NSInteger argB){
              return argA + argB;
          }];
          NSInteger(*funcSum)(id, SEL, NSInteger, NSInteger) = (NSInteger(*)(id, SEL, NSInteger, NSInteger))objc_msgSend;
          NSInteger sum2 = funcSum(self, selSum, 2, 3);
          //sum2 — 5
      

      Реализация оказалась настолько интересной, что я решил написать об этом.
      Читать дальше →
    • Objective-C вопросы на уровень middle/senior

        Что должен знать objc разработчик на уровень middle/senior?
        К сожалению, четкой черты на вертикальное развитие нет. Парадокс, но чтобы знать что изучить, нужно знать что ты не знаешь.
        Я постарался вспомнить самые интересные вопросы, которые мне задавали самому на различных собеседованиях, а так же расширил их множеством вопросов(тем же уровнем) от себя.
        Здесь нет общих вопросов вроде: IoC, design patterns, S.O.L.I.D. и т.п.

        ВНИМАНИЕ!!!
        Помимо вертикального развития немаловажно и горизонтальное

        ВНИМАНИЕ!!! (2)
        Не пишите в комментарии ответы на вопросы, это дает возможность людям самостоятельно разобраться.
        Однако, если у вас имеются интересные вопросы по теме, я с радостью добавлю их в список.

        Конечно, это не заменит живого общения, однако позволит неплохо подготовиться к собеседованиям.


        Начинаем


        Читать дальше →
      • Objective-C integration testing на примере части RSS читалки

        • Tutorial
        В прошлых статьях я рассматривал unit-тесты, в этот раз речь пойдет о интеграционных тестах.
        Чтобы пример не вышел слишком большим, но и содержал материал, я решил написать на примере части RSS Reader'а.
        Будет рассмотрена подделка ответа от сервера для проверки вариантов работы.
        Будет рассмотрено тестирование с CoreData.


        Читать дальше →
      • Objective-C: как работают блоки

          В этой статье я расскажу о расположении блоков (__NSStackBlock__/__NSGlobalBlock__/__NSMallocBlock__), о том, как происходит захват переменных и как это связано с тем, во что компилируется блок.

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

          Начнем с самого начала, как выглядит блок в Objective-C


          Для чего применяются блоки, я расписывать не буду, речь идет не об этом, поэтому давайте сразу рассмотрим интересные моменты на практике.
          Читать дальше →
        • Objective-C что такое на самом деле метод и self? + runtime

            Как self и _cmd оказываются в методе? Как работает dispatch table и категории? Что такое мета-класс? Сколько на самом деле методов у ваших классов в ARC и в MRC? Как работает swizzling?
            Интересно? Добро пожаловать под кат!

            ВНИМАНИЕ!

            Эта статья не рассчитана на начинающих разработчиков… Приношу свои извинения за то, что не рассматриваю многие моменты, которые должен знать Objective-C разработчик.


            Читать дальше →
            • +10
            • 20.3k
            • 4
          • Навигация между экранами с использованием xib файлов

              При чтении различных исходников сталкиваюсь с проектами, реализованными с использованием xib файлов. Мне самому больше нравится использование xib, вместо storyboard (не холивара ради пишу, storyboard тоже хорош), однако часто изучение навигации между экранами превращается в пытку. И поэтому хотелось бы поделится собственным опытом.

              Читать дальше →
            • Да начнется unit-тестирование (Objective-C)

              Данная статья посвящена вопросу тестирования в рамках Objective-C используя Xcode 6. Рассматриваются стандартная библиотека для тестирования и сторонняя библиотека OCMock. Опытные разработчики, возможно, не найдут здесь слишком полезной информации, тем же, кто недавно встал на этот путь — статья откроет необходимые базовые знания по написанию unit-тестов на языке Objective-C.

              Для основы тестирования просьба обратиться сюда.
              Для основы unit-тестирования сюда.

              А теперь мы начнем изучение unit-тестирования в рамках Objective-C.
              Читать дальше →