Рассказ об основных принципах, которых придерживается Viber в длительной разработке приложения с большой кодовой базой — если разработкой занимается распределённая команда. Мы обсудим используемые технологии, библиотеки, работу с кодом и многое другое.
5. Работа с репозиториями
• 1 репозиторий для всего проекта
• Много репозиториев
• 12 git origins, >100 с форками
6. 1 репозиторий
+ -
• Просто для
начального этапа
• Поддерживается
всеми
инструментами
• Разграничения
доступа
• Ветки
• Совместная работа
• Размер
• Скорость работы
7. CocoaPods
+ -
• База готовых pods
для сторонних
библиотек
• Возможность
управления
приватными
репозиториями
• Только для
проектов под iOS,
для остальных
платформ проблема
остается
• Практически не
используем
сторонние
библиотеки
8. Сторонние библиотеки
• Только в исходных кодах
• 7 раз подумать стоит ли брать сторонний код
либо написать самим
• Быть готовым исправлять баги, адаптировать
под новые версии ОС и компилятора быстрее
авторов
• Приватный форк в github (git-svn для svn)
9. Git submodules
• Ссылка на конкретную ревизию внешнего
репозитория в каталоге основного
• Что бы получить весь код для сборки:
git clone … &&
git submodule update --init —update
• Подходит как для внутренних библиотек так и
для стороннего кода
• Работает одинаково на всех платформах
10. Git subtree
• Способ добавить внешний репозиторий, либо
его часть в основной, с сохранением
возможности обновления в обе стороны
• Подходит для случаев, когда внешний
репозиторий активно не взаимодействует с
upstream
• Проще в использовании, код из внешнего
репозитория выглядит как часть основного
21. Недостатки Xcode
• Переодически что-нибудь ломают (а иногда и
чинят)
• Headermap который сложно отключить
• Сборка отдельных файлов под разные
платформы
• Не все документировано
• Скорость сборки не максимальная
22. Немного кода
• Swift
• Main thread profiler
• ReactiveCocoa
• Mantle
23. Swift
• Да, мы используем Swift!
• 15 строчке скрипта для
генерации иконки с номером
версии
• Для кода приложения не
раньше Xcode 6.1
24. Main thread profiler
• UI обрабатывается в
главном потоке, он не
должен блокироваться
• Каждые 0.1с запускать на
выполнение блок в
главном потоке
• Если выполнение блока
задерживается —
уведомление в UI и
backtrace в лог
26. ReactiveCocoa
• Удобная замена KVO
• Функциональное
программирование в ObjC
• Меньше состояния, меньше
багов
• Возрастает порог входа
• Много блоков в коде
29. self и циклические ссылки
• self захватывается как сильная ссылка в
блоке
• Доступ к ivar происходит через неявный
self:
^ { NSLog(@%@, _ivar); };
^ { NSLog(@%@, self-_ivar); };
• Циклическая ссылка получается при
сохранении блока в атрибуте объекта
30. @weakself
• До вызова блока объект, на который указывает
self, хранится по слабой ссылке, а во время
вызова блока — по сильной
• self называется self
• Проверяется доступ к ivar внутри блоков
[RACObserve(self, pttState)
subscribeNext:@weakselfnotnil(^(NSNumber *state)) {
self.isRecordingPTT = !!state.intValue;
} @weakselfend];
https://gist.github.com/notorca/9192459
31. Mantle
• Слой модели данных для приложения
• Замена NSDictionary
• Замена классов состоящих только из
набора @property
• Автоматом добавляет основные методы:
initWithDictionary:, description, debugDescription,
initWithCoder:, encodeWithCoder:, copyWithZone:,
isEqual:, hash:
32. NSDictinary *httpRequestSetup = @{
@URL : [NSURL URLWithString:@http....],
@HTTPMethod : @GET,
@HTTPHeaders : @{},
@HTTPBody : [NSData dataWithString:@],
@resumable : @(YES),
@streamBoundary : @---123---
@streamBody : [NSData dataWithString:@]
};
• Нет проверки типов
• Только тонны тестов спасут когда проект
разрастется
35. • Вся работа с CoreData в фоновом потоке
• NSManagedObjects - MTLModel
• FetchResultController для отслеживания
изменений +логика получения конкретных
обновившихся полей во время merge
NSManagedContext
• ReactiveCocoa для связи всего, пересылки из
потока в поток и throtlling