当前位置: 首页 > 知识库问答 >
问题:

无法从同一类[swift 3.0]中的闭包更改变量

程淮晨
2023-03-14
var serviceTypeName = [String]()

override func viewDidLoad() {
    super.viewDidLoad()
    getServiceType()
    debugPrint(serviceTypeName)
}

我尝试从Web API获取一个名称数组,并将其存储在数组serviceTypeName中。以下是我获取服务名称的函数(我使用了 Alamorfire lib)

func getServiceType() {
            Alamofire.request(...
                .responseJSON { response in
                    switch response.result {
                    case .success:

                        if let responseValue = response.result.value {
                            var serviceName: [String] = []
                            let json = JSON(responseValue)

                            for (key, subJson):(String, JSON) in json["results"] {

                                if let name = subJson["name"].string {
                                    serviceName.insert(name, at: Int(key)!)

                                }
                            }
                            self.serviceTypeName = serviceName

                        } ...

但是,我在这个函数之后得到了空数组< code>[],就像函数什么都没做一样。我确保我从服务器获得了正确的数据,并在每个循环中正确地输入到< code>serviceName中。但我不能将其设置为< code>serviceTypeName。请你指出错误好吗?

共有2个答案

轩辕季同
2023-03-14

Alamofire请求是异步的。这意味着< code>getServiceType()中的代码将与< code>viewDidLoad()函数中的其余代码分开运行。

调用debugPrint(serviceTypeName)时,getServiceType()函数尚未完成处理。

解决这个问题的方法是向< code>getServiceType()函数添加completionHandler:

func getServiceType(completionHandler: () -> ()) {
            Alamofire.request(...
                .responseJSON { response in
                    switch response.result {
                    case .success:

                        if let responseValue = response.result.value {
                            var serviceName: [String] = []
                            let json = JSON(responseValue)

                            for (key, subJson):(String, JSON) in json["results"] {

                                if let name = subJson["name"].string {
                                    serviceName.insert(name, at: Int(key)!)

                                }
                            }
                            self.serviceTypeName = serviceName
                            completionHandler()
                        } ...

然后你可以这样称呼这个函数:

override func viewDidLoad() {
    super.viewDidLoad()
    getServiceType() {
        debugPrint(serviceTypeName)
    }
}

在这里,当完成处理程序由异步函数触发时,将在正确的时间调用调试打印。:)

鲁涵意
2023-03-14

在这个函数之后,我得到了一个空数组<code>〔〕,就像这个函数没有做任何事情一样。

没错,函数什么都没做。更准确地说,函数还没有做任何事情。在函数之后检查值是不成熟的,因为回调是在数据到达时异步执行的。

您需要将代码拆分为两部分:

  • 第一部分启动调用,并给它一个回调,为从调用中接收的结果设置属性。
  • 第二部分处理结果,显示属性或执行您计划执行的其他操作

一旦回调完成设置属性,它需要启动对第二部分的调用,该部分利用了这些属性。

func getServiceType() { // Part 1
    ...
    self.serviceTypeName = serviceName
    dispatch_async(dispatch_get_main_queue()) {
        processServiceName()
    }

}

func processServiceName() { // Part 2
    ... // Do things with self.serviceTypeName
}
 类似资料:
  • LoginSignupActivity.java-- profileActivity.java-- 当我访问ProfileActivity.java内部的id时,它显示空值。我想访问在LoginSignupActivity.java中获得的值。

  • A类源代码: B类源代码: 当我编译B. java时没有错误,当我试图编译A. java时,我得到了: 顺便说一句,我不是用IDE来编译这个,我只是用Geany和nano编辑了文件,然后用javac从终端编译它们。

  • 当我尝试编译代码时,这个错误一直显示

  • 我在更改联系人对象中的变量值时遇到问题。我正在尝试制作一个联系人列表,但我无法更改变量trach方法的值。我有editTouch方法调用change eName方法,这两个方法都传递了ArrayList对象trach引用,所以它不应该在main方法中更改值trach ArrayList时出现问题,但问题是当我想更改对象的名称时它不会更改它。我这里缺少什么吗?

  • 问题内容: 我遇到了一个奇怪的问题,我无法弄清楚在尝试插入程序时弹出的问题。另一个问题是我无法创建一个简单的测试用例,因为每次尝试都可以。我一定缺少一些并发症。但我会尽力清楚地描述这种情况,以防任何人熟悉。 我有一个称为Seed的基类,它是主应用程序的一部分,并由系统类加载器加载。我有一个包含Road类的插件,该类是Seed的子类。它是在运行时从单独的jar文件加载的。Road类引用字段Seed.

  • 问题内容: 有没有办法修改闭包内部变量之一的绑定值?查看示例以更好地理解它。 问题答案: 我认为在Python中没有任何方法可以做到这一点。定义闭包后,将捕获封闭范围内变量的当前状态,并且不再具有可直接引用的名称(从闭包外部)。如果要再次调用,则新的闭包将具有与封闭范围不同的变量集。 在简单的示例中,使用类可能会更好: 如果您确实使用了这种技术,我将不再使用该名称,因为它实际上不再是一个闭包。但是