gpt4 book ai didi

ios - 全局保存和访问接收到的数据

转载 作者:行者123 更新时间:2023-11-28 23:59:48 25 4
gpt4 key购买 nike

我正在尝试从服务器获取一些数据并在应用程序中全局使用它。

我的意思是,例如,我正在使用以下代码从服务中获取数据:

struct Service : Decodable{
let id: Int
let name, description: String
let createdAt: String?
let updatedAt: String?
}

func makeGetCall() {
let todoEndpoint: String = "http://web.src01.view.beta.is.sa/public/api/services"
guard let url = URL(string: todoEndpoint) else {
print("Error: cannot create URL")
return
}
let urlRequest = URLRequest(url: url)

let config = URLSessionConfiguration.default
let session = URLSession(configuration: config)

let task = session.dataTask(with: urlRequest) {
(data, response, error) in
guard error == nil else {
print("error calling GET on /public/api/services")
print(error!)
return
}
guard let responseData = data else {
print("Error: did not receive data")
return
}
do {

let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let todos = try decoder.decode([Service].self, from: responseData)
for todo in todos{
print(todo.name)
}

} catch {
print("error trying to convert data to JSON")
return
}
}
task.resume()
}

此代码在 HomeViewController 中找到并调用,我正在获取我想要的数据。

但我想在另一个 View Controller 和整个应用程序中访问和使用这些数据...

我该怎么做?如何使从函数接收到的数据全局保存以及如何在另一个 View Controller 中使用它?

谁能告诉我该怎么做?

最佳答案

对于这种情况,我们通常使用静态数据。它们可以作为单例或只是静态属性。在您的情况下,缓存数据的静态属性可能会很好。我们可以将 static 属性放入扩展中,因此添加以下内容可能会很好:

// MARK: - Fetching Data
extension Service {

private static var cachedServices: [Service]?

static func fetchServices(_ completion: (_ services: [Service]) -> Void?) {
if let cachedServices = cachedServices {
completion(cachedServices)
} else {
makeGetCall { services in
let newServices = services ?? []
self.cachedServices = newServices
completion(newServices)
}
}
}

}

现在来自世界各地的使用正在调用

Service.fetchServices { services in
}

此调用可能是异步的,也可能不是异步的,具体取决于数据是否已加载。

如果您需要同步访问它们并且确定数据已加载,则只需在扩展中添加另一个方法:

static func getCachedData() -> [Service] {
return cachedServices ?? []
}

此方法将立即返回,但如果尚未接收到数据,则数组将为空。但您可以在任何地方调用 Service.getCachedData()

此缓存现在仅保留到您的应用程序终止为止。如果您想将它们保留更长时间,那么您所需要做的就是添加逻辑以将数据保存和加载到文件或用户默认值中。其逻辑类似于:

private static var cachedServices: [Service]? {
didSet {
self.saveServicesToFile(cachedServices)
}
}

static func fetchServices(_ completion: (_ services: [Service]) -> Void?)
{
if let cachedServices = cachedServices {
completion(cachedServices)
} else if let saved = self.loadFromFile() {
self.cachedServices = saved
completion(saved)
}else {
makeGetCall { services in
let newServices = services ?? []
self.cachedServices = newServices
completion(newServices)
}
}
}

关于ios - 全局保存和访问接收到的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49892588/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com