我有n 个任务发送到服务器。当我启动它们时,[taskN resume]
它们将并行启动,但我想按顺序启动它们 - 如果第一个任务完成,其他任务将启动。有什么建议么?
问问题
1254 次
2 回答
5
我提供了非常简单的解决方案,没有子类化:
样本:
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue setMaxConcurrentOperationCount:1];
// first download task
[queue addOperationWithBlock:^{
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); // create a semaphore
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionTask *task1 = [session dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
dispatch_semaphore_signal(semaphore); // go to another task
}];
[task1 resume];
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); // wait to finish downloading
}];
// second download task
[queue addOperationWithBlock:^{
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionTask *task2 = [session dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
dispatch_semaphore_signal(semaphore);
}];
[task2 resume];
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
}];
这两个操作(task1,task2)将按顺序执行,因此它们将等到n-1操作完成。
使用受 NSURLSession 启发的信号量和 NSBlockOperation 和队列
于 2014-07-02T12:35:33.010 回答
4
为此,您最好使用NSOperation
and NSOperationQueue
。
它管理一个任务队列,每个任务都在后台线程上执行。
通过将队列设置为只有 1 个并发操作,它将按照您的需要将它们排队。
你应该...
创建一个进行
NSOperation
下载的子类。让它做同步下载。它们不需要是异步的,因为它们已经在后台线程上。设置一个
NSOperationQueue
并设置maximumNumberOfConcurrentOperations
为 1。将您的操作添加到队列中。
这是最简单的方法,NSOperationQueue
但您可以用它做更多的事情。
还有几个关于它的问题和教程,所以我不会在这里详细介绍,因为您应该能够找到其他 SO 问题。
于 2014-07-02T08:32:46.740 回答