/AvitoTestTask

Primary LanguageObjective-C

Тестовое задание попытался сделать с архитектурой VIPER, правда без Router'а, потому что заленился делать его для одного экранчика.

Реализовал загрузку данных с последующим сохранением их в БД для возможности вычитывать в дальнейшем без интернета. Реализовал загрузку картинок с сохранением их как в оперативной памяти (через кэш), так и на диске (опять же для возможности вычитывать их в дальнейшем без интернета)

Основные модули

  1. View: содержит контроллер и его представления. View умеет сообщать Presenter'у о событиях. View не просит данные у Presenterэа

  2. Presenter: умеет настраивать View согласно имеющимся данным для отображения. Presenter не знает ничего про сервисы. Знает только про Interactor'а, у которого просит данные для отображения.

  3. Interactor: центрирует в себе бизнес-логику. Знает с какого url качать данные. Сам только раздает указания сервисам: сервису загрузки данных, сервису загрузки и кэширования картинок, модели

  4. Model: знает как именно хранить данные, знает как их вычитывать. Делает это через сервис

  5. Router: должен содержать flow прохождения по экранам приложения

Кто кого retain'ит

Исходил из логики, что View (контроллер) и так живет в памяти посредством окошка, контроллеров навигации, таббара и других. Поэтому его лишний раз можно не retain'ить. View сильно ссылается на Presenter'а. Presenter сильно ссылается на Interactor'а. Если бы был Router, Presenter бы сильно ссылался бы и на Router'а. Interactor сильно ссылается на сервисы.

Сервисы не ссылаются на Interactor'а: общаются с ним через callback-блоки. Interactor слабо ссылается на Presenter'а, чтобы давать ему данные. Presenter слабо ссылается на View, чтобы настраивать его.

Старался в каждом модуле выделить свои PONSO (NSObject'ы). Так сделано, чтобы обратить внимание на то, что модель редактируется только в одном месте. Эти PONSO, к тому же, как правило, неизменяемые (как бонус для многопоточности). Создаются PONSO, как правило, через строителей.

Подпроекты

Utils - просто набор удобных методов

CoreData - умеет инициализировать стек CoreData, знает где искать файл модели, где хранить базу данных

Model - умеет обращаться к CoreData для записи и вычитывания данных

Networking - умеет асинхронно загружать данные из сети

Images - умеет асинхронно загружать картинки из сети, кэшировать их в оперативной памяти и записывать их на диск

Заключение

Делал в Xcode 6.4, а в самом конце перешел на 7-ку. Запускать нужно проект Sample/SampleApp.xcworkspace