如何使用带有NSURLSessionDownloadTask的restclient dropbox API下载文件

时间:2013-12-31 19:57:02

标签: ios dropbox nsurlsession

问题:我想从我的保管箱帐户下载文件并使用快速查看来显示它。

第一个解决方案:

1)使用Dropbox API restClient:

[[self restClient] loadFile:fullpath intoPath:finalpath];

2)下载后,使用QLPreviewController预览文件。

此解决方案的问题在于我不知道如何将下载与预览同步(要快速查看文件需要本地,所以我需要先下载它。)

我提出的(丑陋)解决方法是设置一个警报(“缓存”)并使其持续任意长度的时间(假设为12秒,幻数......)。同时我暂停执行10-12秒(魔术数字):

[NSThread sleepForTimeInterval:12.0f];

...并希望在此时间间隔结束时已下载文件,以便我可以启动QLPreviewController。

这是代码(丑陋,我知道......):

// Define Alert
UIAlertView *downloadAlert = [[UIAlertView alloc] initWithTitle:@"caching" message:nil delegate:nil cancelButtonTitle:nil otherButtonTitles:nil] ;

// If  file does not exist alert downloading is ongoing
if(![[NSFileManager defaultManager] fileExistsAtPath:finalpath])
{
    // Alert Popup
    [downloadAlert show];
    //[self performSelector:@selector(isExecuting) withObject:downloadAlert afterDelay:12];

}

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    //Here your non-main thread.
    if(![[NSFileManager defaultManager] fileExistsAtPath:finalpath])
    {
    [NSThread sleepForTimeInterval:12.0f];
    }

        dispatch_async(dispatch_get_main_queue(), ^{

        // Dismiss alert
        [downloadAlert dismissWithClickedButtonIndex: -1 animated:YES];

        //Here we return to main thread.
        // We use the QuickLook APIs directly to preview the document -
        QLPreviewController *previewController = [[QLPreviewController alloc] init];
        previewController.dataSource = self;
        previewController.delegate = self;
        // Push new viewcontroller, previewing the document
        [[self navigationController] pushViewController:previewController animated:YES];

    });
        });

它确实有效(使用小文件和快速连接)但它不是最佳解决方案......

我认为最好的解决方案是将NSURLSession与dropbox restClient集成,以便使用此例程:

NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration
                                                        delegate:nil
                                                   delegateQueue:[NSOperationQueue mainQueue]];
  NSURLSessionDownloadTask *task;
  task = [session downloadTaskWithRequest:request
                        completionHandler:^(NSURL *localfile, NSURLResponse *response, NSErr or *error) {
/* yes, can do UI things directly because this is called on the main queue */ }];
  [task resume];

但我不确定如何在DropBox API中使用它:任何建议?

谢谢,      DOM

1 个答案:

答案 0 :(得分:1)

看起来API会告诉您进度和完成情况:

- (void)restClient:(DBRestClient*)client loadedFile:(NSString*)destPath contentType:(NSString*)contentType metadata:(DBMetadata*)metadata;
- (void)restClient:(DBRestClient*)client loadProgress:(CGFloat)progress forFile:(NSString*)destPath;

无需直接进行任何睡眠或gcd通话。只需更改您的UI以在下载开始时显示忙碌,并使用这些来更新UI,包括进度和完成情况。