[英]Check for slow (not just if device is connected) Internet connection in Swift iOS 9.3
當互聯網連接速度很慢時,我在處理這個案子時遇到了一些麻煩。 首先,讓我解釋一下。 我可以處理何時設備未連接到Internet以及處理該功能的功能:
public class Reachability
{
class func isConnectedToNetwork() -> Bool
{
var zeroAddress = sockaddr_in(sin_len: 0, sin_family: 0, sin_port: 0, sin_addr: in_addr(s_addr: 0), sin_zero: (0, 0, 0, 0, 0, 0, 0, 0))
zeroAddress.sin_len = UInt8(sizeofValue(zeroAddress))
zeroAddress.sin_family = sa_family_t(AF_INET)
let defaultRouteReachability = withUnsafePointer(&zeroAddress) {
SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, UnsafePointer($0))
}
var flags: SCNetworkReachabilityFlags = SCNetworkReachabilityFlags(rawValue: 0)
if SCNetworkReachabilityGetFlags(defaultRouteReachability!, &flags) == false {
return false
}
let isReachable = flags == .Reachable
let needsConnection = flags == .ConnectionRequired
return isReachable && !needsConnection
}
因此,當設備連接到Internet並且連接快速且穩定時,一切正常。 當設備未連接到Internet時,我收到警告,我需要連接並且也要處理。
問題是,當我連接時,互聯網非常慢,如16 kbps。 通過Alamofire要求很多東西,並且以這種速度下載需要數年時間。 我不介意,如果它沒有停止我的應用程序,並最終崩潰。
我試過這個功能:
class func isInternetActive(input: String, completion: (result: String) -> Void)
{
let qualityOfServiceClass = QOS_CLASS_BACKGROUND
let backgroundQueue = dispatch_get_global_queue(qualityOfServiceClass, 0)
dispatch_async(backgroundQueue, {
Alamofire.request(.GET, "http://www.google.hr").response
{ response in
if response.3 != nil
{
print("NOK")
completion(result: "NOK")
}
print("OK")
completion(result: "OK")
}
})
}
此外,我正在使用Alamofire獲取我的社交媒體視圖控制器和Twitter的數據我正在使用Fabric。
我想要這樣的東西:嘗試獲取數據。 如果你在3-4秒內無法獲取它們。 然后停止請求。 因此,如果您無法在幾秒內下載圖像,請將imageView設置為白色或空白,就像我沒有連接到Internet一樣。
我解決了這個問題。 我通過Alamofire請求一個img URL,然后用代碼設置圖像(帶有該url),例如:
var url:NSURL = NSURL.URLWithString("http://myURL/ios8.png")
var data:NSData = NSData.dataWithContentsOfURL(url, options: nil, error: nil)
這就是問題所在。 Alamofire位於后台線程中,上面的代碼位於主線程中。 因此,當Alamofire完成他的請求時,必須運行代碼。
這是一個例子:
dispatch_async(dispatch_get_global_queue(qualityOfServiceClass, 0), {
Alamofire.request(.GET, "http://blabla.com").responseJSON(completionHandler:
{ (json) -> Void in
if let jsonData = json.result.value
{
if jsonData.isKindOfClass(NSArray)
{
dispatch_async(dispatch_get_main_queue(), { () -> Void in
let secondImageURLL = jsonData[x][ImgURL] as! String
setImageToUrlImageViewForHomeSlider(sliderData, imageToSetL: imageToSetL)
})
}
}
})
})
在這里,您可以看到請求位於全局隊列中,主隊列中的代碼必須等待后台隊列完成,調用函數setImageToUrlImageViewForHomeSlider:
func setImageToUrlImageViewForHomeSlider(sliderDataL: WBMHomeSliderDataM, imageToSetL: UIImageView)
{
let url = NSURL(string: sliderDataL.imageURL!)
imageToSetL.sd_setImageWithURL(url, placeholderImage: UIImage(named: "cloudErrorHomeSlider"))
}
在這個函數中,我使用SDWebImage框架(也是異步運行)來設置帶有下載URL的圖像,如果失敗,則設置占位符圖像。
這樣,您的應用程序可以免費加載,並且由於Internet連接速度慢,它不會停止,凍結或崩潰應用程序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.