目标c -在iOS中使用NSURLConnection以串行顺序下载文件



我想按顺序下载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。有人知道如何实现这一点吗?

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()
}

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

查看这个答案了解更多细节:https://stackoverflow.com/a/21018964

最新更新