URLSession Waiting For Connectivity

If you use?URLSession?to start a task with iOS 10 and the network is not available the connection fails at once with an error. There was a small change in iOS 11 that means you can now tell your?URLSession?to wait until network connectivity is available before trying the connection.

Configuring The Session

To configure a session to wait for connectivity set the?waitsForConnectivityboolean to?true?when creating the session configuration. For example, starting with a default session configuration:

let configuration = URLSessionConfiguration.default

configuration.timeoutIntervalForResource =300

if ?#available(iOS11, *) {??

? ? ? configuration.waitsForConnectivity = true

}

let session =URLSession(configuration: configuration, delegate:self, delegateQueue:nil)

Notes:

The default resource timeout interval is 7 days which might be longer than you want to wait. I changed it to five minutes here.

As with all session configuration settings you must set the?waitsForConnectivity?flag before creating the session. The session takes a copy of the configuration so changing it afterwards has no effect on the created session.

This API is new in iOS 11 so wrap?waitsForConnectivity?in an?#available?if supporting iOS 10 or earlier.

The default for?waitsForConnectivity?is?false?but note that background sessions always wait for connectivity.

Set the delegate when creating the session if you want to know when the session waits for connectivity.

Also remember that?URLSession?keeps a strong reference to its delegate. If the session owner is also the delegate you can end up with a retain cycle unless you call?invalidateAndCancel?on the session at some point to release the delegate and break the cycle.

session.invalidateAndCancel()// Don't use session after this

Waiting For Connectivity

Using iOS 10 or earlier if you start a data task and there is no connectivity it fails at once. You get back an error either via the completion handler or the delegate method?urlSession(_:task:didCompleteWithError:)?depending on which you are using.

In iOS 11 if you set?waitsForConnectivity?to?true?the session waits (it will eventually timeout) and only starts the task if the network connection becomes available. You also get a callback to the URLSessionTaskDelegate?method urlSession(_:taskIsWaitingForConnectivity:)?so you can take some action:

func ?urlSession(_ session: URLSession, ?taskIsWaitingForConnectivity task: URLSessionTask){

? ? ? // waiting for connectivity, update UI, etc.

}

Notes:

The session only waits when trying the initial connection. If the network drops after making the connection you get back an error via the completion handler or session delegate as with iOS 10.

How long the session waits for connectivity depends on the session resource timeout?timeoutIntervalForResource. This defaults to 7 days so you may want to change it to some shorter value when creating the session configuration.

Read More

See this WWDC talk for the changes in?URLSession?in iOS 11:

WWDC 2017 Session 709 Advances in Networking, Part 2

I skipped a few details on how to use?URLsession?so if you need a recap see this earlier WWDC talk:

WWDC 2013 Session 705 What’s New in Foundation Networking

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容