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完了ハンドルが呼び出される前です。理論によれば、シリアル待ち行列を使用することによって、各タスクは前のタスクが完了するのを待ってから実行されます。私の理解は正しい。
キューでシリアル化されるものは、 'NMUserAPIManager'メソッドの呼び出しです。つまり、 'getUserRecentTransactionData'は、' getUserProfileData'が呼び出された後に呼び出されます。完了ハンドラの順序については何も保証しません。 –
要求の発行をシリアルキューに追加しますが、それぞれの応答は追加しません。最も簡単な解決策は、GCDを取り除き、最初のリクエストの完了ハンドラから2番目のリクエストを発行することです。これらの要求を追跡するためにシリアルキューを実際に使用する場合は、個々のリクエストをカスタム 'NSOperation'サブクラスにラップできます(https://stackoverflow.com/a/23837970/1271826またはhttps:// stackoverflowを参照)。 .com/a/24943851/1271826)。あなたが2つの要求をしているなら、それは過度なことかもしれません。 – Rob