我正在 while 循环中运行后台线程,我正在执行一些文件处理任务。循环后我有一些代码。但是循环之后的代码在循环结束之前执行(因为我正在使用后台线程)。有什么方法可以在循环结束后执行一些代码吗?
这是我的代码:
while i < testCount {
let task = AsyncTask(
backgroundTask: {
() -> Double in
// some file handling
return 234.09
},
afterTask: {
(val: Double) in
self.showVal(val)
}
);
task.execute();
i += 1
}
// I want to run this code after the loop ends
print("average: \(avg)")
showVal(avg)
我的showVal(Double)
函数
func showVal(val: Double) {
print("val found: \(val)")
display.text = "\(val) found"
}
这是我的 AsyncTask
类
public class AsyncTask <BGParam,BGResult>{
private var pre:(()->())?;//Optional closure -> called before the backgroundTask
private var bgTask:(param:BGParam)->BGResult;//background task
private var post:((param:BGResult)->())?;//Optional closure -> called after the backgroundTask
public init(beforeTask: (()->())?=nil, backgroundTask: (param:BGParam)->BGResult, afterTask:((param:BGResult)->())?=nil){
self.pre=beforeTask;
self.bgTask=backgroundTask;
self.post=afterTask;
}
public func execute(param:BGParam){
pre?()//if beforeTask exists - invoke it before bgTask
dispatch_async(dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0), {
let bgResult=self.bgTask(param: param);//execute backgroundTask in background thread
if(self.post != nil){//if afterTask exists - invoke it in UI thread after bgTask
dispatch_async(dispatch_get_main_queue(),{self.post!(param: bgResult)});
}
});
}
}
注意:我是 Swift
的初学者。
编辑: 我其实想做的是:
- 后台文件处理任务
- 任务结束后,我想在 UILabel 中显示文本
我需要多次执行这两项任务(比如说 100 次)。如果 swift 对于我的目的有更简单的方法,请告知。
最佳答案
我将尝试使用一些基于我们讨论的伪代码,看看这是否可以帮助您。管理器对象可能看起来有点像这样:
class RequestManager {
private let requiredNumberOfRequests: Int
private let completionHandler: ()->()
private var counter: Int {
didSet {
if counter == requiredNumberOfRequests {
completionHandler()
}
}
}
init(numberOfRequests: Int, completionHandler: ()->()) {
self.requiredNumberOfRequests = numberOfRequests
self.completionHandler = completionHandler
self.counter = 0
}
// Don't know exactly what you want to do here, but something like...
func performRequest(success: (value: Double)->()) {
// Network stuff, on success it looks like you'll have a Double(?)
let value: Double = 234.09
success(value: value)
counter += 1
}
}
然后,在循环之前,您将创建 requestManager 的实例
let manager = RequestManager(numberOfRequests: 100) { average in
print("average: \(average)")
}
...并调用 PerformRequest 作为循环的一部分。
关于xcode - 后台循环结束后运行代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37517635/