【发布时间】:2019-08-27 06:43:33
【问题描述】:
我有一个从 API 请求数据并将其放入全局结构的函数,因此我可以从应用程序的任何位置读取该数据,所有其他函数和类主要在该数据中工作。我想在运行其他类函数之前检查该函数是否已完成数据加载。
其他函数在不同的类中。
我不能使用完成处理程序 (completion: @escaping(_ success: Bool) -> Void)。因为这会在每次调用时触发该函数,因此会导致数据被一遍又一遍地下载。
相反,我正在寻找一种方法来检查该功能是否已完成其下载任务,然后继续执行其他功能。
这必须是动态的,因为假设设备上的互联网无法正常工作,然后用户连接到互联网,则需要再次运行该功能以尝试获取数据(可以使用刷新按钮)并通知其他类和函数它再次完成,以便其他函数可以开始将数据加载到变量中
import Foundation
import Alamofire
import SwiftyJSON
struct GlobalUser {
static var json : JSON!
}
func getData() {
// set api url
let LOCATIONAPI_URL = "https://api.darksky.net/forecast/0123456789abcdef9876543210fedcba/42.3601,-71.0589"
// request JSON from url, using Alamofire Library
Alamofire.request(LOCATIONAPI_URL).responseJSON { (response) in
print("data requested")
let result = response.result
// check if respose is valid
if result.isSuccess{
GlobalUser.json = JSON(result.value!)
}
}
}
【问题讨论】:
-
如果您有一个地方需要访问数据,那么您可以在那里获取数据并使用完成处理程序。如果有多个位置或逻辑松散耦合,那么您可以在获取数据后发布
Notification。感兴趣的对象可以订阅该通知。 -
另外,我建议您将
GlobalUser.json设为普通可选,而不是隐式展开的可选 - 这样您就可以轻松安全地检查数据是否已被检索。 -
@Paulw11 非常感谢,使用
Notification正是我所需要的!我还将 GlobalUser.json 更改为普通的可选项,因此我可以检查变量是否为 nil。谢谢!