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
子类中(请参阅或)。如果你只做了两个请求,那就太过分了。