繁体   English   中英

URLSession.dataTask(with:completionHandler :)是否总是只调用一次completeCompleteHandler?

[英]Does URLSession.dataTask(with:completionHandler:) always call completionHandler only once?

在我使用URLSession.dataTask(with:completionHandler:)创建新的会话数据任务并通过调用其resume()方法启动任务之后,假设应用程序在请求运行时不会崩溃,对我来说,这样做安全URLSession.dataTask(with:completionHandler:)假设即使网络请求(如连接断开)或应用程序(如连接URLSession.dataTask(with:completionHandler:) )发生怪异事件, completionHandler (传递给URLSession.dataTask(with:completionHandler:) )最终将始终仅被调用一次。进入后台)?

注意:我没有在任务上显式调用cancel()suspend() 只是resume()

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

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

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

我的逻辑如何? 会按预期工作吗? 我应该以其他方式这样做吗? 另外,我是否甚至需要在主线程上减少pendingGetFooRequestCount

URLRequest具有timeoutInterval属性,其默认值为60秒。 如果那时没有响应,则以非nil错误调用完成。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM