所以,我正在尝试做一个Alamofire请求,然后,我会从JSON数据中获取我需要的信息,并将其放入全局变量,这是我的代码。
struct myVariables {
static var variableOne = ""
}
func function() {
Alamofire.request(.GET, "API URL").responseJSON { response in
if let rawJSON = response.result.value {
// Here I just take the JSON and put it into dictionaries and parse the data.
myVariables.variableOne = String("data")
}
}
}
好的,所以基本上,我试图从另一个Swift文件访问variableOne的数据。假设我创建了两个Swift文件,在其中一个文件中,我有一个编辑全局变量值的函数,在另一个文件中,如果我试图打印那个全局变量,我就会看到编辑过的值。但是每当我使用Alamofire时,当我试图编辑一个全局变量时,另一个Swift文件看不到改变的值。因此,如果我尝试在Alamofire请求代码块中编辑全局变量,每当我从另一个文件打印变量时,我都看不到变化。
如果有人知道更好的表达方式,请纠正。
我怀疑问题不是您没有看到值的变化,而是由于您正在处理异步方法而引起的问题。例如,当您调用function
时,它立即返回,但是您的variableOne
可能不会立即更新,而是稍后更新。我敢打赌,您是在调用异步响应闭包之前检查它的。
你不会有这个问题,如果你不使用这个"全局"(这是一个坏主意,无论如何),而是自己采用完成处理程序模式。
func performRequest(completionHandler: @escaping (String?, Error?) -> Void) {
Alamofire.request("API URL").responseJSON { response in
switch response.result {
case .failure(let error):
completionHandler(nil, error)
case .success(let responseObject):
let dictionary = responseObject as? [String: Any]
let string = dictionary?["someKey"] as? String
completionHandler(string, nil)
}
}
}
你可以这样调用它:
performRequest() { string, error in
guard let string = string, error == nil else {
// handle error here
return
}
// use `string` here
}
// but not here, because the above closure runs asynchronously (i.e. later)
通过使用这个完成处理程序模式,我们解决了"我如何知道异步方法何时完成"的问题。通过将必要的数据作为闭包的参数传递回来,我们可以减少全局变量的使用,使数据的范围尽可能小。显然,您应该更改闭包的参数,以匹配适合您的情况。希望这能说明基本思想。
查看Swift 2/Alamofire 3答案的先前版本。