Отслеживайте прогресс с помощью нового Dropbox SDK (V2) с помощью метода downloadUrl filesRoutes:overwrite:destination: method

Я пытаюсь загрузить большой файл с новым Dropbox SDK.

Мой код загрузки выглядит примерно так:

DBUserClient *client = [DBClientsManager authorizedClient];

[[client.filesRoutes downloadUrl:remotePath overwrite:YES destination:documentUrl] setResponseBlock:^(DBFILESFileMetadata *result, DBFILESDownloadError *routeError, DBRequestError *networkError, NSURL *destination) {    
        if(result){
            NSLog(@"File Downloaded");
            // open the file after being downloaded
        }
    }];

Ранее я использовал метод loadMetadata класса DBRestClient.

[restClient loadMetadata:path];

который в свою очередь вызовет некоторые другие методы делегата, один из которых

- (void)restClient:(DBRestClient*)client loadProgress:(CGFloat)progress forFile:(NSString*)destPath

в этом методе я мог бы отслеживать прогресс загружаемого файла.

Как я могу отслеживать прогресс моей загрузки в блоке setResponse? Заранее спасибо.

2 ответа

Решение

Ты можешь использовать setProgressBlock установить блок для получения обновлений прогресса. Здесь есть пример:

https://github.com/dropbox/dropbox-sdk-obj-c

Главный кредит идет Грегу.

Я использую MBProgressHUD для визуального отображения загрузки данных / изображений / файлов.

Теперь, после удаления старых делегатов DBRestClient SDK для Dropbox, вот как я это делаю.

В моем случае, во-первых, я перечисляю файлы из выпадающего списка со следующим кодом:

Я загружаю изображение / файл в каталог документов.

Для этого, во-первых, мне нужен список файлов и папок, поэтому я получаю список, вызывая getAllDropboxResourcesFromPath: метод, где путь является корнем дропбокса.

в моем методе viewDidLoad я получаю список.

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self getAllDropboxResourcesFromPath:@"/"];
     self.list = [NSMutableArray alloc]init; //I have the list array in my interface file
}

-(void)getAllDropboxResourcesFromPath:(NSString*)path{

    DBUserClient *client = [DBClientsManager authorizedClient];

    NSMutableArray  *dirList = [[NSMutableArray alloc] init];

    [[client.filesRoutes listFolder:path]
     setResponseBlock:^(DBFILESListFolderResult *response, DBFILESListFolderError *routeError, DBRequestError *networkError) {
         if (response) {
             NSArray<DBFILESMetadata *> *entries = response.entries;
             NSString *cursor = response.cursor;
             BOOL hasMore = [response.hasMore boolValue];

             [self listAllResources:entries];

             if (hasMore){
                 [self keepListingResources:client cursor:cursor];
             }
             else {
                 self.list = dirList;
             }
         } else {
             NSLog(@"%@\n%@\n", routeError, networkError);
         }
     }];
}

- (void)keepListingResources:(DBUserClient *)client cursor:(NSString *)cursor {
    [[client.filesRoutes listFolderContinue:cursor]
     setResponseBlock:^(DBFILESListFolderResult *response, DBFILESListFolderContinueError *routeError,
                        DBRequestError *networkError) {
         if (response) {
             NSArray<DBFILESMetadata *> *entries = response.entries;
             NSString *cursor = response.cursor;
             BOOL hasMore = [response.hasMore boolValue];

             [self listAllResources:entries];

             if (hasMore) {
                 [self keepListingResources:client cursor:cursor];
             }
             else {
                 self.list = dirList;
             }
         } else {
             NSLog(@"%@\n%@\n", routeError, networkError);
         }
     }];
}

- (void) listAllResources:(NSArray<DBFILESMetadata *> *)entries {
    for (DBFILESMetadata *entry in entries) {
           [dirList addObject:entry];    
    }
}

Приведенный выше код хранит все файлы и папки как DBFILESMetadata введите объекты в массив списка.

Теперь я готов к загрузке, но мои файлы большие, поэтому мне нужно показать ход загрузки, для которого я использую MBProgressHUD,

-(void)downloadOnlyImageWithPngFormat:(DBFILESMetadata *)file{

 //adding the progress view when download operation will be called
 self.progressView = [[MBProgressHUD alloc] initWithWindow:[AppDelegate window]]; //I have an instance of MBProgressHUD in my interface file
 [[AppDelegate window] addSubview:self.progressView];

 //checking if the content is a file and if it has png extension
 if ([file isKindOfClass:[DBFILESFileMetadata class]] && [file.name hasSuffix:@".png"]) {

        NSString* documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
        NSString* localPath = [documentsPath stringByAppendingPathComponent:file.pathLower];
        BOOL exists=[[NSFileManager defaultManager] fileExistsAtPath:localPath];
        if(!exists) {
            [[NSFileManager defaultManager] createDirectoryAtPath:localPath withIntermediateDirectories:YES attributes:nil error:nil];
        }
        NSURL *documentUrl = [NSURL fileURLWithPath:localPath];
        NsString *remotePath = file.pathLower;
        DBUserClient *client = [DBClientsManager authorizedClient];
        [[[client.filesRoutes downloadUrl:remotePath overwrite:YES destination:documentUrl] setResponseBlock:^(DBFILESFileMetadata *result, DBFILESDownloadError *routeError, DBRequestError *networkError, NSURL *destination) {
        if(result){
            NSLog(@"File Downloaded");
        }
    }] setProgressBlock:^(int64_t bytesDownloaded, int64_t totalBytesDownloaded, int64_t totalBytesExpectedToDownload) {
        [self setProgress:[self calculateProgress:totalBytesExpectedToDownload andTotalDownloadedBytes:totalBytesDownloaded]];
    }];
}

- (void) setProgress:(CGFloat) progress {
   [self.progressView setProgress:progress];
}
- (CGFloat) calculateProgress:(long long)totalbytes andTotalDownloadedBytes:(long long)downloadedBytes{
    double result = (double)downloadedBytes/totalbytes;
    return result;
}

Надеюсь, что это может помочь другим. Еще раз большое спасибо Грегу за то, что он дал мне подсказки.

Другие вопросы по тегам