2

dispatch_asyncを順番に追加したいと思いますが、ランダムに起動しないようにしたいと思います。 例:以前の最初のdispatch_asyncが終了したときに、2番目のdispatch_asyncを実行する方法は?

ディスパッチ_アシンク1開始...
ディスパッチ_アシンク1が終了します。

ディスパッチ_アシンク2が開始...
ディスパッチ_アシンク2が終了します。

dispatch_async 3が開始...
dispatch_async 3が終了します。

事前に

-(void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    NSLog(@"%@",[connection currentRequest]); 

    NSLog(@"connectionDidFinishLoading"); 
    NSError* error; 
    NSString *responseKey = [self getResponseKey:connection]; 

    NSDictionary* response = [NSJSONSerialization JSONObjectWithData:[receivedData objectForKey:responseKey] options:kNilOptions error:&error]; 
    //NSLog(@"%@", response); 

    if (error) 
    { 
     NSLog(@"Error: %@", error); 
     NSLog(@"Error: Response strange format, not an NSArray and not a NSString!\n%@", [[NSString alloc] initWithData:[receivedData objectForKey:responseKey] encoding:NSUTF8StringEncoding]); 
    } 

    NSLog(@"connection url : %@", connection.currentRequest.URL); 

    if ([[NSString stringWithFormat:@"%@", [connection currentRequest]] rangeOfString:@"getSynchroGuest?"].location != NSNotFound) 
    { 
     NSLog(@"response success"); 
     if ([[response valueForKey:@"lignes"] isKindOfClass:[NSArray class]]) 
     { 
      if ([[response valueForKey:@"lignes"] count] > 0) 
      { 
       dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){ 
        //Background Thread 

       [self fillDataBaseWithDict:response]; 

       nbTotal = nbTotal + PACKET_FOR_SYNC; 

       [self WebServiceSynchroGuest:self.activityIndicator withSynchroBtn:synchroBtn withNbTotal:nbTotal]; 
           }); 

      } 
     } 
... 

おかげで...私はsqliteのを更新する必要があり、最初のディスパッチ中の情報は、第二の発送のために必要です。

SOLUTION: 
       dispatch_async(serialDispatchQueue, ^{ 
        [self fillDataBaseWithDict:response]; 
        nbTotal = nbTotal + PACKET_FOR_SYNC; 

        dispatch_async(dispatch_get_main_queue(), ^(void){ 
        [self WebServiceSynchroGuest:self.activityIndicator withSynchroBtn:synchroBtn withNbTotal:nbTotal]; 
        }); 
       }); 
+0

dispatch_async 1の完了ブロック内にdispatch_async 2などを置くことができます。 –

+0

これはconnectionDidFinishLoadingにありますので、私はWSを起動してディスパッチを開始する前に答えを待つ必要があります – Claudio

+0

できます。完了ハンドラがある場合。ハンドラの最後の行に挿入するだけです。 –

答えて

3

独自のシリアルキュー

を定義し、この

dispatch_queue_t yourSerialQueue = dispatch_queue_create("com.testcompany.testproduct.testserialqueue", DISPATCH_QUEUE_SERIAL); 
dispatch_async(yourSerialQueue, ^{ /* first task */ }); 
dispatch_async(yourSerialQueue, ^{ /* second task to be executed after first task */ }); 

シリアルキューのようなコードを追加するには、タスクが(1、彼らが提出された順に、シリアル方式でexevutedされることを保証します

+0

完璧、それは動作します。また、ディスパッチでリクエストが必要な場合は、メインスレッド上で情報を処理する必要があります。私はチケットを更新しました。 – Claudio

-1

GCDではなくOperationで簡単に実現できます。 OperationクラスはaddDependency(_ op: Operation)の機能を持っています。 、BlockOperationの場合にあなたのコードを入れて依存関係を追加し、OperationQueue

2

でそれらを実行して、あなたのQを取るには、文字通り、あなたが呼び出しをネストする必要があります:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), 
^(void) 
{ 
    // do some work 
    … 
    // finished here 

    // The next async code 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), 
    ^(void) 
    { 
    // do some work 
    … 
    // finished here 

    // and so on 

    } 

} 

しかし、あなたが本当にカスタムシリアルキューを使用するために検討すべきですかNSOperationなど。シリアルQで

dispatch_queue_t stepByStepQueue = dispatch_queue_create("com.you.taks", NULL); 

dispatch_async(stepByStepQueue, 
^(void) 
{ 
    // Step 
}); 

dispatch_async(stepByStepQueue, 
^(void) 
{ 
    // By 
}); 

dispatch_async(stepByStepQueue, 
^(void) 
{ 
    // Step 
}); 
0

最善のアプローチは、それが完了

の順序で呼び出されますqueue.soにそれらを追加NSOperations &を使用することだろうが、あなたはそれをやりたい場合同じ方法で完了ブロックを定義します& dispatch_async2 & dispatch_Async3を補完ブロック&に追加して、それらの完了ブロックを最後に呼び出します。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

      // do some long running processing here 

      // Check that there was not a nil handler passed. 
      if(completionHandler1) 
      { 
       completionHandler1(); 
      } 
      }); 
     }); 
1

すべてのdispatch_asyncをシリアルキューとして配置し、1つずつ実行する

dispatch_group_tグループ= dispatch_group_create();

dispatch_group_async(group,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0),^{ 

    // block1 
    NSLog(@"Block1"); 
    [ NSThread sleepForTimeInterval:5.0]; 
    NSLog(@"Block1 End"); 

}); 

dispatch_group_async(group,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0),^{ 
      // block2 
    NSLog(@"block 2"); 
    [ NSThread sleepForTimeInterval:10.0]; 
    NSLog(@"Block2 End"); 

}); 
dispatch_group_async(group,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0),^{ 

    // block3 
    NSLog(@"block 3"); 
    [ NSThread sleepForTimeInterval:15.0]; 
    NSLog(@"Block3 End"); 
}); 
dispatch_group_notify(group,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0),^{ 

    // block4 
    NSLog(@"block 4"); 
    [ NSThread sleepForTimeInterval:20.0]; 
    NSLog(@"Block4 End"); 
}); 
+0

これは低品質の回答です。答えが分からない場合は、詳細、サンプルコード、または疑似コードを入力して編集してください。 – N0un

0

あなたが同様に優先度を設定することができます
このようなコードを追加します。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

});

});

関連する問題