Swift等待关闭线程完成

时间:2017-10-31 17:42:30

标签: swift alamofire swift-package-manager

我正在使用一个用SPM创建的非常简单的快速项目,其中包含Alamofire。

main.swift:

constraints = { audio: true, video: true };
navigator.mediaDevices.getUserMedia(constraints).then(handleSuccess);

var handleSuccess = function (stream) {  

    var context = new AudioContext();
    var processor = context.createScriptProcessor(1024, 1, 1);
    var input = context.createMediaStreamSource(stream);

    processor.connect(context.destination);
    input.connect(processor);

    processor.onaudioprocess = function (e) {
        // Get sound packets from microphone            
        // e.inputBuffer.getChannelData(0) will now have sound packets
    };
};

如果我不使用锁,则永远不会执行闭包。 有没有办法在退出之前指示等待所有线程或特定线程?

我知道这可以通过Playgrounds轻松实现。

2 个答案:

答案 0 :(得分:13)

等待异步任务的最简单方法是使用信号量:

let semaphore = DispatchSemaphore(value: 0)

doSomethingAsync {
    semaphore.signal()
}

semaphore.wait()

// your code will not get here until the async task completes

或者,如果您正在等待多个任务,则可以使用调度组:

let group = DispatchGroup()

group.enter()
doAsyncTask1 {
    group.leave()
}

group.enter()
doAsyncTask2 {
    group.leave()
}

group.wait()

// You won't get here until all your tasks are done

答案 1 :(得分:3)

对于Swift 3

let group = DispatchGroup()
group.enter()
DispatchQueue.global(qos: .userInitiated).async {
    // Do work asyncly and call group.leave() after you are done
    group.leave()
}
group.notify(queue: .main, execute: {
    // This will be called when block ends             
})

当您需要在完成某项任务后执行某些代码时,此代码将非常有用。

请添加有关您问题的详细信息,然后我可以为您提供更多帮助。