调度队列和 NS 执行队列



我正在创建一个串行队列,在其中添加两个任务,如下所示

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];
        });
    }];
});

在这两个任务中,我正在使用NSURLSession调用Web服务。问题是在我的任务 1 完成句柄之前,任务 2 完成句柄被调用。根据理论,通过使用串行队列,每个任务在执行之前等待前一个任务完成。我的理解是正确的。

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];
        });
    }];
 }

编辑:

如果你正在寻找更健壮的东西,我会看看这篇文章,了解如何子类化NSOperation来制作你自己的异步操作,然后你可以与NSOperationQueue一起使用。

最新更新