全局变量和Alamofire的问题

时间:2016-07-05 02:35:25

标签: ios swift variables global alamofire

所以,我正在尝试做一个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 个答案:

答案 0 :(得分:1)

我怀疑问题不是你没有看到价值变化,而是由于你正在处理异步方法而引起的问题。例如,当您致电function时,它会立即返回,但您的variableOne可能不会立即更新,而是稍后更新。我打赌你在异步响应关闭有机会被调用之前检查它。

如果不是使用这个" global"那么你就不会有这个问题。 (无论如何,这是一个坏主意),你自己采用了完成处理程序模式。

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