2016-07-27 5 views
1

Ich habe einige Probleme mit dem Fall, wenn es eine sehr langsame Internetverbindung ist. Lassen Sie mich zuerst erklären. Ich kann behandeln, wenn das Gerät nicht mit dem Internet und Funktion verbunden ist, die Griffe das heißt:Überprüfen Sie auf langsam (nicht nur, wenn Gerät verbunden ist) Internetverbindung in Swift iOS 9.3

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 
    } 

Also, wenn das Gerät mit dem Internet verbunden ist, und die Verbindung ist schnell und stabil, funktioniert alles einwandfrei. Wenn das Gerät nicht mit dem Internet verbunden ist, erhalte ich eine Warnung, dass ich verbunden sein muss und dass das auch gehandhabt wird.

Problem ist, wenn ich verbunden bin und Internet ist sehr langsam wie 16 kbps. Viele Dinge werden über Alamofire abgefragt, und es dauert Jahre, um diese Geschwindigkeit herunterzuladen. Das würde mich auch nicht stören, wenn es meine App nicht stoppen würde und es schließlich zum Absturz bringen würde.

Ich habe diese Funktion versucht:

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") 
      } 
     }) 

    } 

Auch Alamofire Ich verwende Daten für meine Social-Media-Viewcontrollers zu holen und für Twitter Ich bin mit Stoff.

Ich möchte so etwas wie: Versuchen Sie, Daten zu holen. Wenn Sie sie nicht innerhalb von 3-4 Sekunden abrufen können. dann hör auf zu fragen. Also, wenn Sie das Bild nicht innerhalb weniger Sekunden herunterladen können, lassen Sie dieses ImageView weiß oder leer, so wie wenn ich nicht mit dem Internet verbunden bin.

+0

Werfen Sie einen Blick hier: http://StackOverflow.com/Questions/33865843/Swift-2-1-Alamofire-Timeout-Method und http://StackOverflow.com/Questions/36626075/Handle-Timeout-mit- alamofire – Feldur

+0

Nein, diese Dinge überprüft nur die Verbindung. In meinem Fall ist die Verbindung in Ordnung, aber die Verbindung ist langsam – Stjepan

Antwort

0

Ich löste das Problem. Ich bitte einen img URL durch Alamofire, und dann das Bild gesetzt (mit dieser URL) mit Code zum Beispiel:

var url:NSURL = NSURL.URLWithString("http://myURL/ios8.png") 
var data:NSData = NSData.dataWithContentsOfURL(url, options: nil, error: nil) 

Und das ist das Problem. Alamofire befindet sich im Hintergrundthread und der obige Code befindet sich im Hauptthread. Also muss Code ausgeführt werden, wenn Alamofire seine Anfrage beendet. Hier

ist das Beispiel:

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) 
          }) 
         } 
        } 
      }) 
     }) 

Hier können Sie sehen, dass Anfrage in der globalen Warteschlange ist und der Code in der Hauptwarteschlange muss warten, für den Hintergrund Warteschlange zu beenden, Funktion setImageToUrlImageViewForHomeSlider aufgerufen wird:

func setImageToUrlImageViewForHomeSlider(sliderDataL: WBMHomeSliderDataM, imageToSetL: UIImageView) 
{ 
    let url = NSURL(string: sliderDataL.imageURL!) 
    imageToSetL.sd_setImageWithURL(url, placeholderImage: UIImage(named: "cloudErrorHomeSlider")) 
} 

In dieser Funktion habe ich SDWebImage Rahmen (die auch asynchron ausgeführt wird), um das Bild mit heruntergeladenen URL zu setzen, und wenn es fehlschlägt, wird Platzhalter Bild gesetzt.

Auf diese Weise ist Ihre App kostenlos zum Laden und es wird nicht stoppen, einfrieren oder Absturz der App wegen der langsamen Internetverbindung.