在 运行 秒 Swift 之前等待代码块
Wait for block of code before running second Swift
我正在使用位于 here 的异步库。我的代码如下:
let backgroundBlock = Async.utility {
for serial in serialarray
{
self.getVersion(serial: serial)
}
}
backgroundBlock.main {
print(serialarray)
print(versionarray)
SwiftSpinner.hide()
}
如果我理解正确,getVersion 应该 运行 在后台运行直到它完全完成,然后第二个块应该 运行 并打印出我的两个数组。相反,第一个数组被打印但第二个数组出现空白。我在我的 getVersion 函数中添加了一个 print 来查看它是否正常工作,我可以看到所有的值都被填充了,所以看起来第一个块在打印数组之前没有等待完成。我做错了什么吗?
编辑:
为了更加清楚,上面的代码是在一个简单的 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
是一个异步调用,因此它会立即 return,因此您的方法 getVersion
会立即 return。您需要让 getVersion
方法等到 Alamofire.request
完成调用并且版本数组更新后再继续。
我正在使用位于 here 的异步库。我的代码如下:
let backgroundBlock = Async.utility {
for serial in serialarray
{
self.getVersion(serial: serial)
}
}
backgroundBlock.main {
print(serialarray)
print(versionarray)
SwiftSpinner.hide()
}
如果我理解正确,getVersion 应该 运行 在后台运行直到它完全完成,然后第二个块应该 运行 并打印出我的两个数组。相反,第一个数组被打印但第二个数组出现空白。我在我的 getVersion 函数中添加了一个 print 来查看它是否正常工作,我可以看到所有的值都被填充了,所以看起来第一个块在打印数组之前没有等待完成。我做错了什么吗?
编辑:
为了更加清楚,上面的代码是在一个简单的 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
是一个异步调用,因此它会立即 return,因此您的方法 getVersion
会立即 return。您需要让 getVersion
方法等到 Alamofire.request
完成调用并且版本数组更新后再继续。