Weather — это приложение, разработанное с использованием UIKit, которое демонстрирует навыки разработки мобильных приложений. Приложение позволяет пользователям посмотреть прогноз погоды на ближайшие 24 часа и прогноз погоды на три дня. Погода запрашивается по месту локации пользователя или по названию локации через поиск.
- Архитектура: MVC
- Используемые технологии:
- UIKit, MapKit (MKLocalSearchCompleter), CoreLocation (CLLocationManager)
- AutoLayout, NSLayoutConstraint, Storyboards, UINib
- DispatchQueue, DispatchWorkItem, TimeInterval, Date, typealias, UIView.animate, Protocols, singletones, UIStoryboardSegue, CAGradientLayer
- UITableView (UITableViewDelegate, UITableViewDataSource), UITableViewHeaderFooterView, UITableViewCell, UICollectionView, UICollectionViewCell, UISearchBarDelegate, UIAlertController, UIActivityIndicatorView, UINavigationBarAppearance
- Network: WeatherApi, URLSession, JSONDecoder, Result<Success, Failure>; CodingKey
- Package Dependencies: Kingfisher
- На первом экране отображаются данные погоды, запрошенные по конкретному местоположению или геолокации пользователя. На втором экране осуществляется поиск и выбор конкретного местоположения.
- На первом экране отображается две таблицы: в первой таблице применяется UICollectionView с горизонтальной прокруткой кастомных ячеек UICollectionViewCell внутри UITableViewCell, вторая таблица - UITableView с кастомными ячейками. Также используется два вида header'ов: для каждой таблицы и глобальный для всех таблиц разом.
- CoreLocation: у пользователя запрашивается разрешение на получение локации; при наличии разрешения локация запрашивается автоматически при открытии приложения или по нажатию на кнопку в UINavigationBar. Класс синглтон LocationManager запрашивает данные локации и возвращает во VC через убегающее замыкание тип Result<Success, Failure>.
- Второй экран выделен для MKLocalSearchCompleter, то есть для поиска желаемого местоположения через UISearchBar и подбору вариантов в UITableView под ним. Выбрав нужный вариант в таблице, пользователь автоматически возвращается на первый экран и происходит запрос локации по выбранному местоположению и поиск/отображение погоды по нему. MKLocalSearchCompleter помогает решить вопрос с валидацией поискового запроса.
- Класс Debouncer решает проблему работы MKLocalSearchCompleter с запросами в режиме реального времени, задерживая их на указанное время (2 сек.). Это нужно потому что кол-во запросов в секунду ограничено.
- Фреймворк Kingfisher используется для загрузки и кэширования изображений-значков погоды, чтобы избежать слайд шоу при быстрой прокрутке изображений и траты трафика пользователя.
- Работа с сетью (WeatherApi) осуществляется через класс синглтон NetworkManager. Осуществляется парсинг JSON'а по ссылке и полученные данные переправляются для отображения дальше через убегающее замыкание типом Result<Success, Failure>, то есть во VC попадают сами данные или ошибка, если что-то пошло не так.
Weather/
├── App/
│ ├── AppDelegate.swift
│ ├── SceneDelegate.swift
│ └── Info.plist
├── ViewControllers/
│ ├── WeatherViewController.swift
│ └── SearchViewController.swift
├── Views/
│ ├── TableHeaderView.swift
│ ├── TableHeaderView.xib
│ ├── CollectionTableCell.swift
│ ├── CollectionTableCell.xib
│ ├── DailyForecastCell.swift
│ ├── HourlyForecastCell.swift
│ └── SectionHeaderView.swift
├── Models/
│ ├── Weather.swift
│ └── SectionHeader.swift
├── Services/
│ ├── LocationManager.swift
│ ├── NetworkManager.swift
│ ├── LocalSearchManager.swift
│ └── Debouncer.swift
├── Extensions/
│ ├── Extension + UINavigationController.swift
│ ├── Extension + NSLayoutConstraint.swift
│ ├── Extension + UILayoutPriority.swift
│ ├── Extension + Date.swift
│ ├── Extension + String.swift
│ ├── Extension + UIImage.swift
│ ├── Extension + UIActivityIndicatorView.swift
│ └── Extension + UIView.swift
├── Storyboards/
│ ├── LaunchScreen.storyboard
│ └── Main.storyboard
└── Resources/
└── Assets.xcassets
Package Dependencies
Kingfisher/Для запуска приложения вам потребуется:
-
Установленный Xcode.
-
Клонировать репозиторий:
git clone https://github.com/mokhinsam/Weather.git
-
Открыть проект в Xcode:
cd Weather open Weather.xcodeproj -
Запустить приложение на симуляторе или физическом устройстве.
Если у вас есть вопросы или предложения, вы можете связаться со мной по электронной почте: mokhinsam@gmail.com



