全局变量和 Alamofire 的问题

Posted

技术标签:

【中文标题】全局变量和 Alamofire 的问题【英文标题】:Issue with global variables and Alamofire 【发布时间】:2016-07-05 02:35:25 【问题描述】:

所以,我正在尝试做一个 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 请求代码块中编辑全局变量,那么每当我从另一个文件打印变量时,我都看不到更改。

如果有人知道更好的表达方式,请纠正它。

【问题讨论】:

【参考方案1】:

我怀疑问题不在于您没有看到值变化,而是您正在处理异步方法这一事实引起的问题。例如,当您调用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)

通过使用这种完成处理程序模式,我们解决了“我怎么知道异步方法何时完成”的问题。通过将必要的数据作为闭包的参数传回,我们可以减少对全局变量的使用,使我们的数据范围尽可能地窄。

显然,您应该更改闭包的参数以匹配适合您情况的任何参数。但希望这能说明基本思想。

查看之前的revision of this answer for Swift 2/Alamofire 3 answer。

【讨论】:

谢谢!完美运行。 当我们有 10 个异步请求并且我们想在所有请求都完成后知道它是如何工作的? @py_ios_dev - 标准模式是一个调度组。所以调用者将(a)创建组,let group = DispatchGroup(); (b) 它会定义当小组以group.notify(queue: .main) ... 结束时要做什么; (c) 它会在调用上述function 之前执行group.enter(),并且(d) 它会在传递给function 的完成处理程序中调用group.leave()。然后,当请求完成时,notify 闭包将被调用。 @py_ios_dev - 请参阅***.com/a/34983658/1271826 以获取随机示例。这是下载,但想法与request相同...

以上是关于全局变量和 Alamofire 的问题的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Alamofire 更改全局变量?

Alamofire 访问将数据附加到全局变量

尝试全局访问响应

js中局部变量和全局变量的问题

全局变量和局部变量的区别

C语言中,局部变量和全局变量的问题