在 iOS 中使用 NSURLConnection 按顺序下载文件

Downloading files in serial order using NSURLConnection in iOS

我想按顺序下载 3 个文件。其中两个是 txt 文件,一个是 .gz 文件。我正在使用 NSURLConnection 下载上述文件。

我对 iOS 编程还很陌生。我在 SO 和 google 的其他问题中看到我们可以使用串行调度队列串行地执行一些操作。

但我不知道如何使用 NSURLConnection 执行此操作。我在下面试过但没有用。

 dispatch_queue_t serialQueue = dispatch_queue_create("com.clc.PropQueue", DISPATCH_QUEUE_SERIAL);
dispatch_async(serialQueue, ^{
    [self downloadProp];
});
dispatch_async(serialQueue, ^{
    [self downloadDatabase];
});
dispatch_async(serialQueue, ^{
    [self downloadTxt];
});

以上代码没有执行NSURLCOnnection的connectionDidFinishLoading。有人知道如何实现吗?

只需将您的 NSURLSessionHTTPMaximumConnectionsPerHost 属性 设置为 1,然后按照您想要的顺序添加任务。

有关详细信息,请参阅此答案:

NSURLSession 提供了一个队列,将按照任务创建的顺序下载每个任务。

NSURLSession *session = [NSURLSession sharedSession];

NSURLSessionTask *task1 = [session dataTaskWithURL:[NSURL URLWithString:@"http://yahoo.com"] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
    NSLog(@"Complete 1");
}];
NSURLSessionTask *task2 = [session dataTaskWithURL:[NSURL URLWithString:@"http://msn.com"] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
    NSLog(@"Complete 2");
}];
NSURLSessionTask *task3 = [session dataTaskWithURL:[NSURL URLWithString:@"http://google.com"] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
    NSLog(@"Complete 3");
}];

// Regardless of which order the tasks are "resumed" (aka started) they will execute synchronously in the order added, above.
[task3 resume];
[task1 resume];
[task2 resume];

根据评论和聊天更新:

为了更加确定任务的排序和执行...

NSURLSession *session = [NSURLSession sharedSession];

__block NSURLSessionTask *task1 = nil;
__block NSURLSessionTask *task2 = nil;
__block NSURLSessionTask *task3 = nil;

task1 = [session dataTaskWithURL:urlToFirstFile completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
    // CHECK ERROR
    NSLog(@"First file completed downloading");
    [task2 resume];
}];
task2 = [session dataTaskWithURL:urlToSecondFile completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
    // CHECK ERROR
    NSLog(@"Second file completed downloading");
    [task3 resume];
}];
task3 = [session dataTaskWithURL:[NSURL URLWithString:@"http://google.com"] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
    // CHECK ERROR
    NSLog(@"Third file completed downloading");
}];

[task1 resume];

确保串行操作的简单递归解决方案。

func serialisedRequests(session: URLSession, requests: [URLRequest], index: Int = 0) {

    if index >= requests.count {
        return
    }

    let task = session.dataTask(with: requests[index]) {
        data, response, error in
        serialisedRequests(session: session, requests: requests, index: index+1)
    }
    task.resume()
}