Ios 如何知道后台任务是否在swift中完成?
我一直在用Swift在Iphone上开发一个应用程序。我只是个新手,经验不多。我现在有个问题。一旦我启动了我的应用程序,我就用定时器进行后台处理。例如,我正在调用函数,以检查服务器是否在每两个0.2秒内收到响应。这并不像你认为的那样是一种正确的方式。现在我正试着学习用斯威夫特走路。我真正需要的是,我需要知道后台流程何时完成,我需要启动其他后台流程Ios 如何知道后台任务是否在swift中完成?,ios,swift,grand-central-dispatch,Ios,Swift,Grand Central Dispatch,我一直在用Swift在Iphone上开发一个应用程序。我只是个新手,经验不多。我现在有个问题。一旦我启动了我的应用程序,我就用定时器进行后台处理。例如,我正在调用函数,以检查服务器是否在每两个0.2秒内收到响应。这并不像你认为的那样是一种正确的方式。现在我正试着学习用斯威夫特走路。我真正需要的是,我需要知道后台流程何时完成,我需要启动其他后台流程 DispatchQueue.global(cos: .UserInteractive).async{ //some request and
DispatchQueue.global(cos: .UserInteractive).async{
//some request and parsing json
}
现在我需要知道这个任务已经完成了。我必须开始另一项任务。详细地说,我将检查所需的最后一个版本,然后我将发出登录请求,然后我将从背景中提取一些图像,然后我将完成动画。这就是为什么我需要知道如何知道一个后台线程已完成,以便我可以启动其他线程。我想我应该使用串行队列,对吗?
再想一想,我必须检查这个过程是否花费了这么多时间,所以我会提醒用户连接
DispatchQueueHelper.delay(byseconds: x, cos:.background){
// will this work for killing the thread
}
您可以使用调度组跟踪您的操作:
let dispatchGroup = DispatchGroup()
dispatchGroup.enter()
dispatchGroup.leave()
dispatchGroup.notify(queue: .main) {
// Back on main
}
但这通常是在一次创建多个请求时发生的。通常,网络请求有自己的完成块,完成后会向您发出警报。比如:
URLSession.shared.dataTask(with: url) {(data, response, error) in
// Task is done
}
execute(request: request { result in
switch result {
case .success(let model):
// Handle data
case .failure(let error):
// Handle error
}
})
在为执行请求而调用的函数中,应将completionBlock保留为:
func execute(request url: URLRequest, completion: (() -> ()) {
URLSession.shared.dataTask(with: url) {(data, response, error) in
completion()
}
}
当然,您不应该立即调用completion,因为您希望处理数据并将其发送到内部
在swift 5中,他们引入了Result
,这是在completionBlockcompletion:((Result)->())中发送的一件很棒的事情
另一方面,它看起来像:
URLSession.shared.dataTask(with: url) {(data, response, error) in
// Task is done
}
execute(request: request { result in
switch result {
case .success(let model):
// Handle data
case .failure(let error):
// Handle error
}
})
您可以使用同步而不是异步,并在队列中添加多个任务。
这样他们就会一个接一个地被处决
另一方面,async同时运行它们,更难知道哪一个在何时完成。谢谢您的解释。这就像一个教程,谢谢。但当它运行completion()时,我如何才能通知其他方法,我如何才能知道completion()已被执行。@MrBozkurt这句话是否有任何延续?哦,对不起,你是对的,因为我太关注任务的完成,对不起,我是这样理解的。好的,我会尝试同步,如何为进程分配时间?常见的模式是“完成处理程序”。您为各自的异步方法提供了一个“完成处理程序”闭包,当异步过程(不管是什么)完成时,将调用该闭包。但是这里的代码片段太模糊,我们无法具体说明。我建议你给我们一些现实的代码片段。