如何串行执行多个 NSURLSessionDataTask?
How to execute multiple NSURLSessionDataTask serially?
就我而言,当应用程序启动时,我想使用 NSURLSessionDataTask
调用 3 个网络 API。每个 API 我有 3 种不同的方法,在每个方法中,有一个 NSURLSessionDataTask
。
我想以这 3 个方法串行执行的方式调整我的代码。因为,方法 B 取决于方法 A 的响应,而方法 C 取决于方法 B 的响应。每个方法在得到 API 响应后也会做一些数据库操作。所以,我需要串行执行 methodA
、methodB
和 methodC
。
我知道这是合乎逻辑的事情,但我想使用 dispatch_semaphore_t
或 dispatch_group_wait
,但我完全不知道如何将它们与 NSURLSessionDataTask
结合使用。
我试过这个:
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
[self syncA:^(BOOL success) {
NSLog(@"syncA — Completed");
dispatch_semaphore_signal(semaphore);
}];
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
[self syncB:^(BOOL success) {
NSLog(@"syncB — Completed");
dispatch_semaphore_signal(semaphore);
}];
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
[self syncC:^(BOOL success) {
NSLog(@"syncC — Completed");
dispatch_semaphore_signal(semaphore);
}];
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
NSLog(@"************* END OF SYNC *************");
以上代码卡在了第一种方法上
您使用的是主队列中的那些吗?不要运行回调和dispatch_semaphore_wait在同一个队列阻塞,因为dispatch_semaphore_wait会阻塞队列,回调不会执行,会造成死锁。
就我而言,当应用程序启动时,我想使用 NSURLSessionDataTask
调用 3 个网络 API。每个 API 我有 3 种不同的方法,在每个方法中,有一个 NSURLSessionDataTask
。
我想以这 3 个方法串行执行的方式调整我的代码。因为,方法 B 取决于方法 A 的响应,而方法 C 取决于方法 B 的响应。每个方法在得到 API 响应后也会做一些数据库操作。所以,我需要串行执行 methodA
、methodB
和 methodC
。
我知道这是合乎逻辑的事情,但我想使用 dispatch_semaphore_t
或 dispatch_group_wait
,但我完全不知道如何将它们与 NSURLSessionDataTask
结合使用。
我试过这个:
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
[self syncA:^(BOOL success) {
NSLog(@"syncA — Completed");
dispatch_semaphore_signal(semaphore);
}];
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
[self syncB:^(BOOL success) {
NSLog(@"syncB — Completed");
dispatch_semaphore_signal(semaphore);
}];
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
[self syncC:^(BOOL success) {
NSLog(@"syncC — Completed");
dispatch_semaphore_signal(semaphore);
}];
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
NSLog(@"************* END OF SYNC *************");
以上代码卡在了第一种方法上
您使用的是主队列中的那些吗?不要运行回调和dispatch_semaphore_wait在同一个队列阻塞,因为dispatch_semaphore_wait会阻塞队列,回调不会执行,会造成死锁。