2017-05-25 16 views
0

は私がNSURLSessionでWebサービスを呼び出していますその2つのタスク内部派遣キューとNSOperationキュー

dispatch_queue_t serial = dispatch_queue_create("com.apple.serial", DISPATCH_QUEUE_SERIAL); 

**//Task 1** 
dispatch_async(serial, ^{ 

    [NMUserAPIManager getUserProfileData:^(NMUser *objUser) { 

     NSLog(@"Get User Profile ....."); 

     _objUser = objUser; 

    }]; 

}); 


**//Task 2** 
dispatch_async(serial, ^{ 

    [NMUserAPIManager getUserRecentTransactionData:^(NSDictionary *responseDictionary) { 
     _accountTableView.hidden = NO; 
     [self recentTransactionSetup:responseDictionary]; 

     NSLog(@"Get User Recent transaction"); 

     dispatch_async(dispatch_get_main_queue(), ^{ 
      [self reloadTableData]; 
     }); 
    }]; 

}); 

以下のように私は2つのタスクを追加するシリアルキューを作成しています。問題は、私のタスク1完了ハンドルTask2完了ハンドルが呼び出される前です。理論によれば、シリアル待ち行列を使用することによって、各タスクは前のタスクが完了するのを待ってから実行されます。私の理解は正しい。

+0

キューでシリアル化されるものは、 'NMUserAPIManager'メソッドの呼び出しです。つまり、 'getUserRecentTransactionData'は、' getUserProfileData'が呼び出された後に呼び出されます。完了ハンドラの順序については何も保証しません。 –

+0

要求の発行をシリアルキューに追加しますが、それぞれの応答は追加しません。最も簡単な解決策は、GCDを取り除き、最初のリクエストの完了ハンドラから2番目のリクエストを発行することです。これらの要求を追跡するためにシリアルキューを実際に使用する場合は、個々のリクエストをカスタム 'NSOperation'サブクラスにラップできます(https://stackoverflow.com/a/23837970/1271826またはhttps:// stackoverflowを参照)。 .com/a/24943851/1271826)。あなたが2つの要求をしているなら、それは過度なことかもしれません。 – Rob

答えて

0

NSURLSessionはすでにバックグラウンドスレッドで実行されているので、ここでは、getUserProfileData:を呼び出すと、シリアルキューに関する限り、キュー内のブロックの作業が完了します。NSURLSession別のスレッドで実行されています。

[NMUserAPIManager getUserProfileData:^(NMUser *objUser) { 

    NSLog(@"Get User Profile ....."); 

    _objUser = objUser; 

    [self getUserTransactions]; 

}]; 

-(void)getUserTransactions 
{ 
     [NMUserAPIManager getUserRecentTransactionData:^(NSDictionary *responseDictionary) { 
     _accountTableView.hidden = NO; 
     [self recentTransactionSetup:responseDictionary]; 

     NSLog(@"Get User Recent transaction"); 

     dispatch_async(dispatch_get_main_queue(), ^{ 
      [self reloadTableData]; 
     }); 
    }]; 
} 

EDIT:

ここにあなたの主な目標は、あなたの最初の1が完了した後、単にあなたの2番目のタスクを呼び出すことであるならば、私はあなたがおそらく単にような何かをやったほうが良いでしょう、独自のキューを必要とは思いません

もう少し頑強なものをお探しの場合は、NSOperationをサブクラス化してNSOperationQueueで使用できる独自の非同期操作を作成する方法については、this postを確認してください。