Это пример CategoriesProvider.Он просто хранит категории в памяти, и вы можете использовать их в приложении.Это не лучший способ сделать это и не лучшая архитектура, но его легко начать.
class CategoriesProvider {
static let shared = CategoriesProvider()
private(set) var categories: [Category]?
private let categoryRequest = ResourceRequest<Category>(resourcePath: "categories")
private let dataTask: URLSessionDataTask?
private init() {}
func fetchData(completion: @escaping (([Category]?) -> Void)) {
guard categories == nil else {
completion(categories)
return
}
dataTask?.cancel()
dataTask = categoryRequest.fetchData { [weak self] categoryResult in
var fetchedCategories: [Category]?
switch categoryResult {
case .failure:
print("error")
case .success(let categories):
fetchedCategories = categories
}
DispatchQueue.main.async {
self?.categories = fetchedCategories
completion(fetchedCategories)
}
}
}
}
Я предлагаю использовать URLSessionDataTask для отмены предыдущей задачи.Это может произойти, когда вы звоните fetchData
несколько раз один за другим.Вы должны изменить свой ResourceRequest и вернуть значение URLSession.shared.dataTask(...)
Здесь больше подробностей о задаче данных https://www.raywenderlich.com/3244963-urlsession-tutorial-getting-started#toc-anchor-004 (DataTask и DownloadTask)
Теперь вы можете выбирать категории в CategoriesViewController втаким образом:
private func loadTableViewData() {
CategoriesProvider.shared.fetchData { [weak self] categories in
guard let self = self, let categories = categories else { return }
self.categories = categories
self.tableView.reloadData()
}
}
В других контроллерах представления вы можете сделать то же самое, но можете проверить категории, прежде чем делать выборку.
if let categories = CategoriesProvider.shared.categories {
// do something
} else {
CategoriesProvider.shared.fetchData { [weak self] categories in
// do something
}
}