设置 URLSession 超时间隔
Posted
技术标签:
【中文标题】设置 URLSession 超时间隔【英文标题】:Set URLSession Timout Interval 【发布时间】:2017-05-24 05:58:05 【问题描述】:我正在尝试将 URLSession 超时间隔设置为 5 秒。该网页是本地页面,因此应在该时间内加载。如果网页在 5 秒内未加载,我希望弹出一条警报消息并告诉用户连接到网络。我的问题是,如何使用我已经拥有的工作代码来实现它?我尝试使用几个不同的例子(一个被注释掉)但没有运气。任何帮助表示赞赏:)
func loadINFO()
let urlString = "mytestphp.php"
let url = URL(string: urlString)
//Try To Set Timout Interval...
//let urlconfig = URLSessionConfiguration.default
//urlconfig.timeoutIntervalForRequest = 5
//urlconfig.timeoutIntervalForResource = 5
//let session = URLSession(configuration: urlconfig)
URLSession.shared.dataTask(with:url!) (data, response, error ) in
if error != nil
//Alert User That They Are Not Connected To The Device
self.CreateAlert(title: "Error!", message: "Please Connect To Network and Try Again")
print(error as Any)
else
do
let parsedData = try JSONSerialization.jsonObject(with: data!, options: []) as! [String:Any]
if let ssid = parsedData["SSID"] as? String,
let pass = parsedData["PASS"] as? String
DispatchQueue.main.async
// Update UI
self.SSID_INPUT.text = (ssid)
self.PASS_INPUT.text = (pass)
catch let error as NSError
print(error)
.resume()
仍然没有得到答案..如果有人有更好的解决方案,我会全力以赴。
编辑:只是为了进一步澄清。 php web 服务器正在我更改 ssid 和 psk 的设备上运行。因此,如果用户不在正确的网络上,我希望他们收到我的警报。问题是,ssid 不是静态的,所以我无法检查它们是否连接到特定的字符串值。这就是为什么我想看看我是否可以降低默认会话超时间隔,并通过查看他们是否可以访问 php 网页来告诉(几秒钟后)他们是否在网络上。
【问题讨论】:
这可能就是你要找的东西..***.com/questions/23428793/… 我相信你是对的,但是我无法成功实现这一点。上面注释的代码与该链接建议的代码相同(我相信)。 【参考方案1】:三个想法:
您可以使用Core Foundation 中的CNCopyCurrentNetworkInfo
功能检查用户是否在正确的Wi-Fi 网络上。如果用户在错误的网络上,则无需等待请求失败。
我假设您遇到了由于蜂窝网络接管应发送到(可能已断开连接的)Wi-Fi 网络的请求而导致的停顿。尝试在请求或会话级别禁用蜂窝网络,很多事情可能会开始神奇地工作。
您应该使用普通计时器 (NSTimer
) 来显示某种被动的 UI 指示器,而不是让网络请求超时(这会终止在网络不可靠的情况下仍可能成功的连接)。网络连接错误”(不强制用户与该指示器交互)。这会告诉用户,如果网络由于某种原因(多路径干扰、微波炉等造成的高丢包率)变慢,可能会出现问题而不会导致故障。
在您的情况下,由于网络可能会发生变化,您可能应该定期启动额外的网络请求与第一个并行请求,并在运行两个或三个以上的请求后取消原始请求。您还可以使用CNCopyCurrentNetworkInfo
(或者更好的是可达性)来确定网络何时发生变化,并等待安排第一个请求,直到您加入网络。
【讨论】:
CNCopyCurrentNetworkInfo 是一个巧妙的技巧,但我不相信它会在这种情况下工作,因为网络 ID 不是静态的。 (这实际上是这个ap的一个功能,改变ssid和psk)。让我看看我是否可以进一步解释我想要做的事情.. 在这种情况下,我会建议上面的第三种方法。显示一些文本,如“无法到达路由器。你在正确的网络上吗?(仍在尝试。)”,并使用普通的 NSTimer 触发它,并让网络请求不理会,直到它成功、失败或用户取消它.或者,使用该计时器启动附加并行请求,并使用指数退避。 顺便说一句,如果您要设置 SSID,为什么不知道预期的 SSID?它应该是以前的 SSID 或您设置的新 SSID,不是吗? 我会按照您在第三点中的建议考虑使用 NSTimer。 SSID 在第一次启动时是随机的,所以我不知道默认的 SSID。不过,我也许可以解决这个问题。在用户更改 SSID 后,它将被知道,以便在第一次更改后可以工作。以上是关于设置 URLSession 超时间隔的主要内容,如果未能解决你的问题,请参考以下文章
URLSession dataTaskPublisher 在特定错误延迟后重试
URLSession 配置的标头设置仅适用于 PUT,不适用于 POST
如何在 Swift 3 中使用带有代理的 URLSession
swift URLSessionの拡张(URLSession#synchronousDataTask,URLSession #retryDataTask)ref:http://qiita.com/to