gpt4 book ai didi

ios - 是否 URLSession.dataTask(与 :completionHandler:) always call completionHandler only once?

转载 作者:行者123 更新时间:2023-11-28 13:50:54 27 4
gpt4 key购买 nike

在我使用 URLSession.dataTask(with:completionHandler:) 创建新的 session 数据任务之后并通过调用其 resume() 来启动任务方法,鉴于应用程序在请求运行时不会崩溃,我可以安全地假设 completionHandler (传递给上面的 URLSession.dataTask(with:completionHandler:))最终总是只会被调用一次,即使网络请求(比如连接断开)或应用程序(比如它进入后台)发生了奇怪的事情?

注意:我没有明确调用 cancel()suspend()在任务上。就resume() .

我想知道这个问题的答案,因为(从我的应用程序的主线程)我正在创建并启动(一个接一个)多个异步网络请求,并且想知道最后一个请求何时完成。

具体来说,我正在开发一个应用程序,它有一个名为 Account 的自定义类.在启动时,该应用程序(假设它找到存储在 UserDefaults 中的帐户访问 token )仅创建该类的一个实例并将其存储到一个名为 account 的全局变量(在整个应用程序中)。 , 代表应用程序当前登录的帐户。

我添加了一个存储的 var (实例)属性到 Account称为 pendingGetFooRequestCount (例如)并将其设置为 0默认情况下。每次我调用Account.getFoo() (实例方法),我添加 1pendingGetFooRequestCount (就在调用 resume() 之前)。里面completionHandler (传递给 URLSession.dataTask(with:completionHandler:) 并且(为了安全起见)在传递给 DispatchQueue.main.async() 的闭包内,我首先从 1 中减去 pendingGetFooRequestCount 然后检查 pendingGetFooRequestCount 是否等于 0 。如果是这样,我知道最后一个 get-foo 请求已经完成,我可以调用另一个方法来继续流程。

我的逻辑如何?这会按预期工作吗?我应该换一种方式吗?另外,我什至需要减少 pendingGetFooRequestCount 吗?在主线程上?

最佳答案

URLRequest 有一个timeoutInterval 属性,它的默认值为60 秒。如果届时没有响应,则调用完成并返回非零错误。

关于ios - 是否 URLSession.dataTask(与 :completionHandler:) always call completionHandler only once?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54623102/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com