Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 调度队列和操作队列_Ios_Objective C_Ios7_Grand Central Dispatch - Fatal编程技术网

Ios 调度队列和操作队列

Ios 调度队列和操作队列,ios,objective-c,ios7,grand-central-dispatch,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 Pr

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

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

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一起使用。

队列序列化的内容是对
nmuserapimager
方法的调用。这意味着在调用
getUserProfileData
之后将调用
getUserRecentTransactionData
。它不保证完成处理程序的顺序。您将在串行队列中添加请求的发出,但不添加它们各自的响应。最简单的解决方案是摆脱GCD,只需从第一个请求的完成处理程序发出第二个请求。如果确实希望使用串行队列跟踪这些请求,可以将单个请求包装在自定义
NSOperation
子类中(请参阅或)。如果你只做了两个请求,那就太过分了。