同时NSURLD下载

时间:2010-11-07 20:48:02

标签: objective-c cocoa macos download nsurlconnection

我设置了一个Cocoa Mac应用程序,可以使用NSURLDownload将文件下载到特定文件夹。只需一次下载一次即可。但是,如果我尝试启动多次下载,除了最后一次之外的所有内容都会立即失败。

有没有办法使用NSURLDownload进行多个同步下载?或者排队多个URL按顺序下载的好方法是什么?或者是否有更合适的方法来实现这一点(NSURLConnection似乎可以,但我不确定我是否可以使用NSURLDownload设置下载位置和文件名)?

3 个答案:

答案 0 :(得分:2)

每个NSURLDownload代表一个下载实例。您可能尝试多次重复使用同一个。它是一个固有的异步系统,已经使用了后台线程。以下是基于Apple示例代码的示例:

 - (void)startDownloadingURL:sender
{
    // Create a couple requests.
    NSURLRequest *requestOne = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.apple.com"]
                                                cachePolicy:NSURLRequestUseProtocolCachePolicy
                                            timeoutInterval:60.0];

    NSURLRequest *requestTwo = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://stackoverflow.com"]
                                                cachePolicy:NSURLRequestUseProtocolCachePolicy
                                            timeoutInterval:60.0];

    // Create two download instances
    NSURLDownload *downloadOne = [[NSURLDownload alloc] initWithRequest:requestOne delegate:self];
    NSURLDownload *downloadTwo = [[NSURLDownload alloc] initWithRequest:requestTwo delegate:self];

    if (downloadOne) {
        // Set the destination file.
        [downloadOne setDestination:@"/tmp" allowOverwrite:YES];
    } else {
        // inform the user that the download failed.
    }
    if (downloadTwo) {
        // Set the destination file.
        [downloadTwo setDestination:@"/tmp" allowOverwrite:YES];
    } else {
        // inform the user that the download failed.
    }
}


- (void)download:(NSURLDownload *)download didFailWithError:(NSError *)error
{
    // Release the connection.
    [download release];

    // Inform the user.
    NSLog(@"Download failed! Error - %@ %@",
          [error localizedDescription],
          [[error userInfo] objectForKey:NSErrorFailingURLStringErrorKey]);
}

- (void)downloadDidFinish:(NSURLDownload *)download
{
    NSLog(@"The download %@ has finished.", download)

    // Release the download connection.
    [download release];
}

如果您尝试对两个NSURLRequests使用相同的NSURLDownload,则会终止之前的连接。

答案 1 :(得分:0)

如果您使用的是10.5+或更高,我会使用NSOperation。您可以在每次下载时将1个操作放入队列中。或者您甚至可以使用sendSynchronous请求并将其与NSOperationQUeue的addOperationWithBlock(10.6+)方法一起使用,然后在您的块中,您可以使用[[NSOperationQueue mainQueue] addOperationWithBlock:^ {当您使用代码时你需要执行或者只需要定期刷新主线程上的UI,就像这样......

[myQueue addOperationWithBlock:^{
    //download stuff here...
    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
         //update main thread UI
    }];
}];

每次下载都需要这样做。

答案 2 :(得分:-1)

如果你的目标是10.5+,你应该看看NSOperation。它应该允许您为单个下载构建通用解决方案,然后使用内置队列工具来管理依赖项,如果您需要某些操作在其他操作开始之前完成下载。

请记住,这些API通常希望所涉及的委托方法在主线程上运行,因此如果您正在使用通过委托方法运行的异步API,则需要确保这样做。 (你可以通过使用performSelectorOnMainThread:and friends)来完成这个任务。