问题:我想从我的保管箱帐户下载文件并使用快速查看来显示它。
第一个解决方案:
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
答案 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,包括进度和完成情况。