几个DownloadTasks顺序

时间:2014-07-02 08:27:25

标签: ios nsurlsessiondownloadtask

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

2 个答案:

答案 0 :(得分: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 with NSBlockOperation and queues

启发的信号量

答案 1 :(得分:4)

为此,您最好使用NSOperationNSOperationQueue

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

通过将队列设置为只有1个并发操作,它将按需要排队。

你应该......

  1. 创建一个用于下载的NSOperation子类。让它做SYNCHRONOUS下载。他们不需要异步,因为他们已经在后台线程上。

  2. 设置NSOperationQueue并将maximumNumberOfConcurrentOperations设为1。

  3. 将您的操作添加到队列中。

  4. 这是接近NSOperationQueue的最简单方法,但您可以使用它做更多事情。

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