簡體   English   中英

在Swift iOS 9.3中檢查速度是否緩慢(不僅僅是設備已連接)Internet連接

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM