ios - 全局变量和 Alamofire 的问题

标签 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 请求代码块中编辑全局变量,无论何时从另一个文件打印变量,我都看不到变化。

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

最佳答案

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

关于ios - 全局变量和 Alamofire 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38194430/

相关文章:

iphone - 为每个部分自定义 UITableView 部分边框颜色

ios - 如何为 iOS 制作纺车?

ios - 从 Parse 检索 CreatedAt 数据 - Swift

php - 如何获取我需要的变量值

ios - 在 View Controller 之间共享一个例程

ios - 转换为不相关的类型总是失败

ios - 如何在 swift 3 中自定义按钮的大小?

swift - TableViewCell中textField的输入滚动后消失

python获取文件名并在另一个脚本中打开

variables - 如何修改java字节码中局部变量的类型