2016-07-27 9 views
1

非常に遅いインターネット接続がある場合は、問題の処理に問題があります。まず、説明しましょう。遅い(デバイスが接続されている場合だけではない)を確認する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 
    } 

デバイスがインターネットに接続され、接続が高速で安定しているときに、すべてが正常に動作します:デバイスはつまりハンドル、インターネットや機能に接続されていないとき、私は扱うことができます。デバイスがインターネットに接続されていない場合、私は接続する必要があるという警告を受け取り、それも処理されます。

問題は、私が接続されていて、インターネットが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") 
      } 
     }) 

    } 

また、私は私のソーシャルメディアviewcontrollersのためのデータをフェッチするAlamofireを使用していますし、Twitterのために私はファブリックを使用しています。

私は次のようにしたいと思います:データを取得してみてください。 3〜4秒以内にそれらを取得できない場合。要求を停止します。ですから、数秒以内にイメージをダウンロードできない場合は、インターネットに接続していないときと同じように、imageViewを白または空にしてください。

+0

ここをクリックしてください:http://stackoverflow.com/questions/33865843/swift-2-1-alamofire-timeout-method and http://stackoverflow.com/questions/36626075/handle-timeout-with- alamofire – Feldur

+0

ナー、これらのものは接続をチェックするだけです。私の場合は接続は正常ですが、接続は遅いです – Stjepan

答えて

0

私はこの問題を解決しました。私は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")) 
} 

私は、ダウンロードURLと画像を設定する(非同期実行もある)SDWebImageフレームワークを使用し、それが失敗した場合、プレースホルダの画像が設定されています。

このようにして、あなたのアプリは読み込み用に無料で、インターネット接続が遅いため、アプリケーションを停止、フリーズ、クラッシュさせることはありません。

関連する問題