Dispatch Queue和NSOperation队列

时间:2017-05-25 19:49:22

标签: ios objective-c ios7 grand-central-dispatch

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

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完成之前处理Task2完成句柄被调用。根据理论,通过使用串行队列,每个任务在执行之前等待前一个任务完成。我的理解是正确的。

1 个答案:

答案 0 :(得分:1)

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

编辑:

如果您正在寻找更强大的东西,我会查看this post,了解如何将NSOperation子类化为自己的异步操作,然后您可以将其与NSOperationQueue一起使用。