Практическое задание
Нужно разработать iOS приложение для просмотра GitHub репозиториев.
Во время работы над практическим заданием настоятельно рекомендуем обращаться к разделу Памятки для разработчика
Кликабельный прототип
Функциональные требования
- Авторизация пользователя (personal access token)
- Просмотр списка репозиториев пользователя (первые 10)
- Просмотр детальной информации выбранного репозитория
- статистика (forks, stars, watchers)
- ссылка на web страницу репозитория
- лицензия
- readme
Технические требования
- Реализация на Swift
- Использовать Interface Builder (xib, не storyboard)
- Использовать Alamofire для работы с REST API
- Использовать UITableView для отображения списка
- Использовать Constraints для экрана детальной информации
- Использовать переходы между ViewController'ами через push, а не через seque
- Использовать Codable для парсинга json
- Сохранять токен авторизации в хранилище устройства - NSUserDefaults
- Корректно обрабатывать ситуации "загрузка данных", "ошибка загрузки", "пустой список"
- Корректно обрабатывать смену ориентации экрана
- При перезапуске приложения авторизация должна сохраняться
- Использовать локализацию для всех строк, показываемых пользователю
- Использовать векторную графику везде, где это возможно
- Обеспечить поддержку iOS 13.0
Классы iOS приложения
class RepositoriesListViewController: UIViewController {
// TODO:
}
class RepositoryDetailInfoViewController: UIViewController {
// TODO:
}
class AuthViewController: UIViewController {
// TODO:
}
class AppRepository {
func getRepositories(completion: @escaping (Array<Repo>?, Error?) -> Void) {
// TODO:
}
func getRepository(repoId: String, completion: @escaping (RepoDetails?, Error?) -> Void) {
// TODO:
}
func getRepositoryReadme(ownerName: String, repositoryName: String, branchName: String, completion: @escaping (String?, Error?) -> Void) {
// TODO:
}
func signIn(token: String, completion: @escaping (UserInfo?, Error?) -> Void) {
// TODO:
}
// TODO:
}
class KeyValueStorage {
var authToken: String?
}
Диаграмма классов
В отличии от android в iOS у нас нет сильной необходимости применять MVVM и реактивные хранилища состояния. iOS приложение не пересоздает экраны и позволяет передавать между экранами объекты, поэтому предлагаем не усложнять решение.
Сделаем 3 экрана. С авторизации на список репозиториев переход делаем после успешного выполнения запроса авторизации (обращением к репозиторию), а с списка репозиториев на детальный вид репозитория переходить будем передавая сущность репозитория.
Все 3 экрана будут напрямую работать с репозиторием и обновлять свое внутреннее состояние при получении ответов от репозитория.