Commit
This commit is contained in:
@ -11,8 +11,8 @@ enum NetworkError: String, Error, LocalizedError {
|
||||
case invalidUrl
|
||||
case invalidResponse
|
||||
case invalidData
|
||||
case noNetwork
|
||||
case noError
|
||||
case timeout
|
||||
|
||||
var errorDescription: String? {
|
||||
switch self {
|
||||
@ -22,8 +22,8 @@ enum NetworkError: String, Error, LocalizedError {
|
||||
"InvalidResponse"
|
||||
case .invalidData:
|
||||
"Проверьте номер группы"
|
||||
case .noNetwork:
|
||||
"No network connection"
|
||||
case .timeout:
|
||||
"Ошибка сети"
|
||||
case .noError:
|
||||
"Нет ошибки"
|
||||
}
|
||||
@ -37,8 +37,8 @@ enum NetworkError: String, Error, LocalizedError {
|
||||
"Для этой недели расписания еще нет"
|
||||
case .invalidData:
|
||||
"Похоже такой группы не существует"
|
||||
case .noNetwork:
|
||||
"Проверьте подключение к интернету и попробуйте заново"
|
||||
case .timeout:
|
||||
"Проверьте соединение с интернетом"
|
||||
case .noError:
|
||||
"Ошибки нет"
|
||||
}
|
||||
|
@ -14,9 +14,14 @@ final class NetworkManager {
|
||||
private let decoder = JSONDecoder()
|
||||
private let urlForGroup = "https://webictis.sfedu.ru/schedule-api/?query="
|
||||
private let urlForWeek = "https://webictis.sfedu.ru/schedule-api/?group="
|
||||
private let customSession: URLSession // Кастомная сессия для ограничения времени ответа от сервера
|
||||
|
||||
//MARK: Initializer
|
||||
private init() {
|
||||
let configuration = URLSessionConfiguration.default
|
||||
configuration.timeoutIntervalForRequest = 3 // Таймаут запроса 10 секунд
|
||||
configuration.timeoutIntervalForResource = 3 // Таймаут ресурса 15 секунд
|
||||
self.customSession = URLSession(configuration: configuration)
|
||||
decoder.dateDecodingStrategy = .iso8601
|
||||
}
|
||||
|
||||
@ -32,7 +37,7 @@ final class NetworkManager {
|
||||
func getSchedule(_ group: String) async throws -> Schedule {
|
||||
let newUrlForGroup = makeUrlForGroup(group)
|
||||
guard let url = URL(string: newUrlForGroup) else { throw NetworkError.invalidUrl }
|
||||
let (data, response) = try await URLSession.shared.data(from: url)
|
||||
let (data, response) = try await customSession.data(from: url)
|
||||
guard let response = response as? HTTPURLResponse, response.statusCode == 200 else { throw NetworkError.invalidResponse }
|
||||
|
||||
do {
|
||||
@ -47,7 +52,7 @@ final class NetworkManager {
|
||||
let newUrlForWeek = makeUrlForWeek(numOfWeek, htmlNameOfGroup)
|
||||
print(newUrlForWeek)
|
||||
guard let url = URL(string: newUrlForWeek) else { throw NetworkError.invalidUrl }
|
||||
let (data, response) = try await URLSession.shared.data(from: url)
|
||||
let (data, response) = try await customSession.data(from: url)
|
||||
guard let response = response as? HTTPURLResponse, response.statusCode == 200 else { throw NetworkError.invalidResponse }
|
||||
|
||||
do {
|
||||
@ -61,7 +66,7 @@ final class NetworkManager {
|
||||
func getGroups(group: String) async throws -> Welcome {
|
||||
let newUrlForGroups = makeUrlForGroup(group)
|
||||
guard let url = URL(string: newUrlForGroups) else { throw NetworkError.invalidUrl }
|
||||
let (data, response) = try await URLSession.shared.data(from: url)
|
||||
let (data, response) = try await customSession.data(from: url)
|
||||
guard let response = response as? HTTPURLResponse, response.statusCode == 200 else { throw NetworkError.invalidResponse }
|
||||
|
||||
do {
|
||||
|
37
Schedule ICTIS/Utilities/Network/NetworkMonitor.swift
Normal file
37
Schedule ICTIS/Utilities/Network/NetworkMonitor.swift
Normal file
@ -0,0 +1,37 @@
|
||||
//
|
||||
// NetworkMonitor.swift
|
||||
// Schedule ICTIS
|
||||
//
|
||||
// Created by Mironov Egor on 27.03.2025.
|
||||
//
|
||||
|
||||
import Network
|
||||
import SwiftUI
|
||||
|
||||
class NetworkMonitor: ObservableObject {
|
||||
@Published var isConnected: Bool = false
|
||||
private let monitor = NWPathMonitor()
|
||||
private let queue = DispatchQueue(label: "NetworkMonitorQueue")
|
||||
|
||||
init() {
|
||||
startMonitoring()
|
||||
}
|
||||
|
||||
func startMonitoring() {
|
||||
monitor.pathUpdateHandler = { [weak self] path in
|
||||
DispatchQueue.main.async {
|
||||
self?.isConnected = path.status == .satisfied
|
||||
print(self?.isConnected == true ? "✅ Интернет подключен!" : "❌ Нет подключения к интернету.")
|
||||
}
|
||||
}
|
||||
monitor.start(queue: queue)
|
||||
}
|
||||
|
||||
func stopMonitoring() {
|
||||
monitor.cancel()
|
||||
}
|
||||
|
||||
deinit {
|
||||
stopMonitoring()
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user