2017-03-28 19 views
0

私は数秒ごとにHTTPリクエストを実行する(swift 2で)関数を書いています。 私はこれらの要求をスケジュールするためにタイマーを使用しています。すぐにNSURLSessionでスレッドを再利用する

問題は、各要求が新しいスレッドを使用するため、数分後に私は完了した直後に閉じられた多くのスレッドを使用しましたが、このジョブを実行するスレッドを使用することを好みます。

機能は次のとおりです。

func getStatus() 
{ 
    let strUrl:String = MY_URL; 
    let url = NSURL(string:strUrl); 

    let defaultSession = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration(),); 
    var dataTask:NSURLSessionDataTask? 

    dataTask = defaultSession.dataTaskWithURL(url!) 
    { 
     data, response, error in 
     if let error = error 
     { 
      print(error.localizedDescription); 
     } 
     else if let httpresponse = response as? NSHTTPURLResponse 
     { 
      if httpresponse.statusCode == 200 
      { 
       self.getDataFromJson(data); 
      } 
     } 
    } 
    dataTask?.resume(); 

    myTimer = NSTimer.scheduledTimerWithTimeInterval(retryInterval, 
                target: self, 
                selector: #selector(getStatus), 
                userInfo: nil, 
                repeats: false); 
} 

そのための正しい方法は何ですか?

ありがとうございます!

答えて

0

私は、getStatusが完了した(そしておそらくデータタスクがまだ動作している)たびにトリガするのではなく、データタスクの完了ハンドラ/クロージャ内に新しいタイマをスケジュールする方が良いと思います。

// ... 
dataTask = defaultSession.dataTaskWithURL(url!) 
{ 
    data, response, error in 
    //... 
    Dispatch.main.async { 
     self.myTimer = NSTimer.scheduledTimerWithTimeInterval(retryInterval, 
                   target: self, 
                   selector: #selector(getStatus), 
                   userInfo: nil, 
                   repeats: false); 
    } 
} 
dataTask?.resume(); 
// ... 

それとも、タイマーの代わりにDispatchQueue.main.asyncAfter(deadline: .now() + retryInterval) { ... }を使用することができますので、1つのデータだけタスクは、一度のようなものを実行します。

+0

ありがとうございます!私はスレッドの詳細(NSThread.currentThread())を表示し、スレッドの数はまだ増加しています、私はいつも同じスレッドを使用したいです....それは動作しませんでした:( – kande

+0

あなたは "詳細は? 'dataTaskWithURL'クロージャー内、または(' getStatus'内の)外側 –

+0

「else if let httpresponse = response ...」の直後にクロージャーの内側に出力されます: {number = 17 、name =(null)}、数秒後には18,19,20など... – kande

関連する問題