xcode - 后台循环结束后运行代码

标签 xcode swift multithreading

我正在 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 的初学者。

编辑: 我其实想做的是:

  1. 后台文件处理任务
  2. 任务结束后,我想在 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/

相关文章:

c++ - 为什么这个简单的线程代码会失败?

ios - 从 beta tester iOS 设备获取日志的最简单方法?

ios - 如何解决: Xcode Archive upload failed with error 22421

ios - Xcode 在打开 .xcodeproj 文件时崩溃

ios - Arduino/Swift - BLE 通信 POST 和 GET

multithreading - 如何在 Linux (Kubernetes) 上解决 ASP.NET Core 中的线程不足问题?

c - 基本的 posix 线程参数传递问题

ios - 如何在 Xcode 5 中为单个文件禁用 ARC?

swift - xcode7 上出现错误。 view.layer.renderInContext(上下文!)

SwiftUI 导航 View : how to update previous view every time coming back from the secondary view