我正在使用位于here的异步库。我的代码如下:

let backgroundBlock = Async.utility {
        for serial in serialarray
         {
        self.getVersion(serial: serial)
         }
    }



backgroundBlock.main {
            print(serialarray)
            print(versionarray)
            SwiftSpinner.hide()
    }


如果我理解这一权利,则getVersion应该在后台运行,直到完全完成,然后第二个块应该运行并打印出我的两个数组。而是打印第一个数组,但第二个数组空白。我在getVersion函数内部添加了一个打印,以查看它是否正常工作,并且可以看到所有值都已填充,因此看起来第一个块在打印数组之前就没有等待完成。难道我做错了什么?

编辑:

为了更加清楚,上面的代码在简单的alamofire请求的完成处理程序中执行。而getVersion函数如下:

Alamofire.request("url=\(serial)", headers: httpheader).validate().responseData { response in

        switch response.result {

        case .success:

            if let data = response.data {

                let xml = SWXMLHash.parse(data)

                var count: Int = 0

                var stop = false

                for elem in xml["deviceSoftwares"]["deviceSw"].all

                {

                     for elem2 in elem["swAttrs"].all

                     {


                        if stop == false

                        {
                             count += 1

                        if (elem2["value"].element!.text) == "com.fiberlink.maas360.fpl"
                        {
                           stop = true
                        }

                        }

                    }
                }


                let position = (count/5)


                SwiftSpinner.hide()

                if stop == true

                {
                let version = xml["deviceSoftwares"]["deviceSw"][position]["swAttrs"][2]["value"].element!.text

                    versionarray.append(version)
                }

                else

                {
                    versionarray.append("N/A")


                }

                print (versionarray)

            }

        case .failure(_):

            let errorCode = response.response?.statusCode
            let errorString = String(describing: errorCode!)
            print("Error " + errorString)


        }

        }


编辑2:

我还尝试了以下方法:

let group = AsyncGroup()

                group.utility {

                    for serial in serialarray

                    {

                   self.getVersion(serial: serial)

                    }

                }

                group.wait()


                     print (serialarray)
                     print (versionarray)

                   SwiftSpinner.hide()


在getVersion完成其循环以填充数组之前,两个打印都在执行。

最佳答案

Alamofire.request是异步调用,因此它将立即返回,因此您的方法getVersion将立即返回。您需要使getVersion方法等到Alamofire.request完成调用并更新versionarray后再继续。

关于swift - 等待代码块,然后运行第二个Swift,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45126109/

10-11 19:55