【问题标题】:Set URLSession Timout Interval设置 URLSession 超时间隔
【发布时间】: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 网页来告诉(几秒钟后)他们是否在网络上。

【问题讨论】:

  • 这可能就是你要找的东西..stackoverflow.com/questions/23428793/…
  • 我相信你是对的,但是我无法成功实现这一点。上面注释的代码与该链接建议的代码相同(我相信)。

标签: php swift3 nsurlsession


【解决方案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 后,它将被知道,以便在第一次更改后可以工作。
猜你喜欢
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 2017-08-28
  • 2018-04-04
  • 1970-01-01
  • 1970-01-01
  • 2021-03-01
  • 2019-09-14
相关资源
最近更新 更多