Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/118.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何知道后台任务是否在swift中完成?_Ios_Swift_Grand Central Dispatch - Fatal编程技术网

Ios 如何知道后台任务是否在swift中完成?

Ios 如何知道后台任务是否在swift中完成?,ios,swift,grand-central-dispatch,Ios,Swift,Grand Central Dispatch,我一直在用Swift在Iphone上开发一个应用程序。我只是个新手,经验不多。我现在有个问题。一旦我启动了我的应用程序,我就用定时器进行后台处理。例如,我正在调用函数,以检查服务器是否在每两个0.2秒内收到响应。这并不像你认为的那样是一种正确的方式。现在我正试着学习用斯威夫特走路。我真正需要的是,我需要知道后台流程何时完成,我需要启动其他后台流程 DispatchQueue.global(cos: .UserInteractive).async{ //some request and

我一直在用Swift在Iphone上开发一个应用程序。我只是个新手,经验不多。我现在有个问题。一旦我启动了我的应用程序,我就用定时器进行后台处理。例如,我正在调用函数,以检查服务器是否在每两个0.2秒内收到响应。这并不像你认为的那样是一种正确的方式。现在我正试着学习用斯威夫特走路。我真正需要的是,我需要知道后台流程何时完成,我需要启动其他后台流程

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
,这是在completionBlock
completion:((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这句话是否有任何延续?哦,对不起,你是对的,因为我太关注任务的完成,对不起,我是这样理解的。好的,我会尝试同步,如何为进程分配时间?常见的模式是“完成处理程序”。您为各自的异步方法提供了一个“完成处理程序”闭包,当异步过程(不管是什么)完成时,将调用该闭包。但是这里的代码片段太模糊,我们无法具体说明。我建议你给我们一些现实的代码片段。