Ios 按顺序下载多个任务

Ios 按顺序下载多个任务,ios,nsurlsessiondownloadtask,Ios,Nsurlsessiondownloadtask,我有n个任务发送到服务器。当我通过[taskN resume]启动它们时,它们将并行启动,但我希望按顺序启动它们-如果第一个任务完成,其他任务将启动。 有什么建议吗?为此,您最好使用NSOperation和NSOperationQueue 它管理一个任务队列,每个任务都在后台线程上执行 通过将队列设置为只有1个并发操作,它将按照您的意愿对它们进行排队 你应该 创建一个执行下载操作的NSOperation子类。让它进行同步下载。它们不需要是异步的,因为它们已经在后台线程上了 设置NSOperati

我有n个任务发送到服务器。当我通过
[taskN resume]
启动它们时,它们将并行启动,但我希望按顺序启动它们-如果第一个任务完成,其他任务将启动。
有什么建议吗?

为此,您最好使用
NSOperation
NSOperationQueue

它管理一个任务队列,每个任务都在后台线程上执行

通过将队列设置为只有1个并发操作,它将按照您的意愿对它们进行排队

你应该

  • 创建一个执行下载操作的
    NSOperation
    子类。让它进行同步下载。它们不需要是异步的,因为它们已经在后台线程上了

  • 设置
    NSOperationQueue
    并将
    maximumNumberOfConcurrentOperations
    设置为1

  • 将您的操作添加到队列中

  • 这是处理
    NSOperationQueue
    的最简单方法,但您可以使用它做更多的事情


    还有一些关于它的问题和教程,所以我不会在这里详细介绍,因为您应该能够找到其他so问题。

    我提供了一个非常简单的解决方案,没有子类化:

    样本:

        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操作完成


    这是我一直在寻找的答案。Thanks@vaberer不用担心,乐意帮忙。