[英]URLSession dataTask completionHandler does not work in playground
[英]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
加到pendingGetFooRequestCount
( pendingGetFooRequestCount
在调用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.