2017-09-12 12 views
0

私のアプリでは、ユーザが開始日と終了日を入力し、URLがデータを取得します。各URLは、サーバから大きなサイズのJSON文字列を返します。複数のURLRequestをforループ内で実行してください。前回終了した後に実行してください

問題が発生すると、ユーザーがサーバーをハングするように長い日付間隔を入力すると問題が発生します。アプリのアンドロイド版では、これを行うためにAsyncTaskを使用しました。その中で、ユーザが大きな日付間隔を入力すると、リクエストを複数に分割します。 forループを使用して毎日データを取得し、毎日のタスクが完了した後にonProgressUpdateに進捗を公開します。

また、私はforループで複数のデータタスクを使用し、結果を公開する必要があります。

for i in 0 ..< dates.count { 
    // Getting response from server // 
    let response = getResponse(imei: sImei, date: dates[i]) 
    parseResponse(response) 
} 

これは私がこれを行う方法です。しかし、これを実装する方法を知らない。

私はDispatchGroupを使用するいくつかの提案を見ました。私はそれに精通していない。だから私の仕事を達成するために私を案内してください。

注:単一のdataTaskで日付間隔を長くすると、サーバーが停止します。それは、ローエンドのサーバーだからです。だから私は個々の日付のデータをクエリし、それらを結合する必要があります。

+0

この投稿をお読みくださいhttps://stackoverflow.com/questions/42484281/waiting-until-the-task-finishes/42484761#42484761それはあなたを助けるかもしれません。 –

+0

あなたのリクエストは互いに独立していますか? 1つのリクエストの結果を次のリクエストの前に使用しない場合、次のリクエストの結果を送信する前に、それらのリクエストを同時に実行し、リクエストが完了するのを待つのがよいでしょう。 –

答えて

1

再帰を使用します。最初はi = 0です。

func callApi(i : Int){ 

    if(dates.count > i){ 

    // After Getting response from server // 

     self.callApi(i: i + 1) 

} 

} 
0

ループを作成してNSBlockOperationを生成し、前の操作にaddDependencyを使用してください。

var prevOperation 
for i in 0 ..< dates.count { 

    var operation = NSBlockOperation() { 
     // Getting response from server // 
     let response = getResponse(imei: sImei, date: dates[i]) 
     parseResponse(response) 
    } 

    if(i>0) { 
     operation.addDependency(prevOperation) 
    } 
    prevOperation=operation; 
} 
関連する問題