2016-05-26 23 views
2

私はそうのように私のアプリでNSURLSessionを使用しています:スウィフトNSURLSession本当に本当に遅い

func wsQAshowTag(tag: Int, completion: ([AnyObject]! -> Void)) { 
     let requestString = NSString(format: “URL”, tag) as String 
     let url: NSURL! = NSURL(string: requestString) 
     let task = NSURLSession.sharedSession().dataTaskWithURL(url, completionHandler: { 
      data, response, error in 
      do { 
       let result = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.AllowFragments) as! [AnyObject] 
       completion(result) 
      } 
      catch { 
       completion(nil) 
      } 
     }) 
     task.resume() 
    } 

予想通り、この作品、私はそれが非常に速い見つけNSURLConnectionを使用していたとき、しかし私は、それは非常に非常に遅い探しています(これは同じURLを使用しています)NSURLConnectionが非常に高速の場合、NSURLSessionは非常に遅いですか? NSURLSessionをスピードアップするためにそこにいるのですか?ここで

は、私はそれを呼び出しています方法です:

self.wsQAshowTag(Int(barcode)!, completion: { wsQAshowTagArray in 
    //Code Here 
}) 
+0

これは非同期方式であることをご存知ですか?バックグラウンドスレッドで実行しますか? –

+0

あなたは 'POST'メソッドまたは' GET'メソッドのために使用していますか? –

+1

「NSURLSessionはどのように非常に遅いのですか?」そうではありません。ネットワーク要求はネットワーク要求であり、速度は使用する方法とは無関係です。しかし、バックグラウンドで実行される非同期メソッドなので、完成したスレッドをメインスレッドに戻す必要がありますか? – Moritz

答えて

4

UIアップデートをメインキューに送信する必要があります。メインキューに送信せずに更新すると、データの更新に非常に時間がかかることがあります。

私たちがJSONを解析しているので、completion(result)もラップする必要があります。

コードは、格納された完了ハンドラを取得し、メインスレッド上で呼び出します。

func wsQAshowTag(tag: Int, completion: ([AnyObject]! -> Void)) { 
let requestString = NSString(format: "URL", tag) as String 
let url: NSURL! = NSURL(string: requestString) 
let task = NSURLSession.sharedSession().dataTaskWithURL(url, completionHandler: { 
    data, response, error in 
    do { 
     let result = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.AllowFragments) as! [AnyObject] 
     dispatch_async(dispatch_get_main_queue()) { 
      completion(result) 
     } 
    } catch { 
     dispatch_async(dispatch_get_main_queue()) { 
     completion(nil) 
     } 
     print("error serializing JSON: \(error)") 
    } 
}) 
task.resume() 
} 
+0

私は、著者がどのような回答を受け入れるべきかに関する私のコメントを決定し、取り除くようにします。 – Andrej

+1

@Andrejあなたは私の答えはあなたがあなたのコメントを削除した受け入れられた答えでなければならないと言った。意見を持つことに間違いはありません。誰もあなたをいじめさせないでください。 – tymac

+0

スルタン。私の編集をチェックすると、すでに両方の補完をdispatch_asyncでラップしていることがわかります。私は過去5分間の自分の答えを編集しています。私はチュートリアルを読むことを著者に教えていない。私は、著者が恩恵を受けているコードソリューションを使用して、完全かつ完全な回答を著者に与えます。私はまた、メインスレッド上のデータを解析するだけでなく、catchのエラーのためのコンソール出力を追加することについての情報を追加しました。 – tymac

0

completionハンドラが(それは通常ありません)UIの状態を変更する場合は、すべてのcompletion(...)周り

dispatch_async(dispatch_get_main_queue()) { 
    ... 
} 

を追加する必要があります。

URLセッションの完了ハンドラがバックグラウンドキューで呼び出され、バックグラウンドスレッドからUIを変更するのが間違っており、通常は長いポーズを作成します。

これは、接続を開始したスレッド、つまり通常はメインスレッドでデリゲートメソッドが常に呼び出されたNSURLConnectionとは異なります。

たとえば、this tutorialを参照してください。

関連する問題