2013-05-15 2 views
1

Когда я вызываю DBRestClient для загрузки файла по заданному пути, API не вызывает функции загрузки.Dropbox iOS Core SDK не загружает файлы

Например:

- (void) downloadFiles:(NSMutableArray *)files 
{ 
    NSLog(@"%@", files); 
    itemsToBeDownloaded = [[NSMutableArray alloc] initWithArray:files]; 
    restClient = [self restClient]; 
    for (NSString *string in files) 
    { 
     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
     NSString *documentsDirectory = [paths objectAtIndex:0]; 
     NSString *filePath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"/Dropbox%@", string]]; 
     [restClient loadFile:string intoPath:filePath]; 
    } 
} 

печати files возвращает ( "/Blank.pdf" )

печать string возвращает /Blank.pdf

печать filePath возвращает /var/mobile/Applications/0C506400-7142-41E2-9F3D-0965985CED9E/Documents/Dropbox/Blank.pdf

Так что функция вызывается, и знает, файлы и их пути ' s для загрузки.

Однако, когда я звоню [restClient loadFile:string intoPath:filePath];, ничего не происходит. У меня есть методы делегатов в:

- (void) restClient:(DBRestClient *)client loadedFile:(NSString *)destPath 
{ 
    NSLog(@"Called!"); 
} 

- (void) restClient:(DBRestClient *)client loadedFile:(NSString *)destPath contentType:(NSString *)contentType 
{ 
    NSLog(@"Called!"); 
} 

- (void) restClient:(DBRestClient *)client loadedFile:(NSString *)destPath contentType:(NSString *)contentType metadata:(DBMetadata *)metadata 
{ 
    NSLog(@"%@", destPath); 
    NSLog(@"%@", contentType); 
    NSLog(@"%@", metadata); 
} 

- (void) restClient:(DBRestClient *)client loadFileFailedWithError:(NSError *)error 
{ 
    NSLog(@"Error downloading file: %@", error); 
} 

Заявление выполнено не Called!. Кажется, RestClient не загружает данные.

Другое примечание: restClient = [self restClient]; действительно возвращает действительный DBRestClient, поэтому я знаю, что он действителен. Однако вызов для загрузки файла не вызывается.

Есть ли конкретная причина, по которой звонок loadFile: не производится? У меня есть загрузка Метаданных в порядке.

EDIT: вызов loadMetadata: на string делает НЕ вызвать метод делегата loadMetadata.

EDIT 2: код ниже перечислены как испрашивается массив к файлу:

- (void) downloadFiles 
{ 
    NSMutableArray *filesToDownload = [[NSMutableArray alloc] init]; 
    for (int i = 0; i < [[itemsToDownload allKeys] count]; ++i) 
    { 
     for (NSString *string in [itemsToDownload objectForKey:[[itemsToDownload allKeys] objectAtIndex:i]]) 
     { 
      [filesToDownload addObject:[NSString stringWithFormat:@"%@%@", [[itemsToDownload allKeys] objectAtIndex:i], string]]; 
     } 
    } 
    [dropboxController downloadFiles:filesToDownload]; 
} 
+0

wait Я смущен, что вы говорите «Нет призванных! выдается ', так что вы точно видите в своем журнале? –

+0

'2013-05-15 12:22:43.868 XXX [50112: 7a23] Файлы: ( "/Blank.pdf" ) ' ' purgeIdleCellConnections: найдено один для очистки conn = 0x1d5f14f0' –

+0

Итак, где Blank.pdf в вашем Dropbox? у вас есть папка с песочницей api или вы используете целый Dropbox? –

ответ

4

Так что я выяснял целая проблема. Оказывается, вы не можете вызывать остальные клиентские методы из фонового потока, его нужно вызвать в основном потоке.

+0

Это связано с тем, что DBRestClient использует NSURLConnection внутренне и для связи между NSURLConnection (используемым как асинхронно) и основным потоком, вы можете сослаться на этот вопрос для детализации: http://stackoverflow.com/questions/10535201/nsurlconnection- необходим-а-nsrunloop-на-казнить –

0

Сначала я думал, что вы звоните неправильный путь в раздаточной, но событие, то вы должны получить сообщение об ошибке.

Если ваш restClient возвращает метод делегата даже с неправильным путем, должен был быть вызван ваш - (void)restClient:(DBRestClient*)client loadFileFailedWithError:(NSError*)error.

Я сомневаюсь, что ваш restClient инициирован правильно.

в вашем файле .h:

#import <DropboxSDK/DropboxSDK.h> 
@property (nonatomic, strong) DBRestClient *restClient; 

in.your.m файла:

#import <DropboxSDK/DropboxSDK.h> 
@synthesize restClient = _restClient; 
- (DBRestClient *)restClient { 
    if (!_restClient) { 
     _restClient = 
     [[DBRestClient alloc] initWithSession:[DBSession sharedSession]]; 
     _restClient.delegate = self; 
    } 
    return _restClient; 
} 

затем попытаться вызвать ваш

[[self restClient] loadFile:@"string" intoPath: @"pathstring" ];

+0

Хуже всего то, что у меня есть все это. Приложение использует один централизованный сценарий Dropbox, который обрабатывает все операции с Dropbox. Этот скрипт содержит код, и он работает в других представлениях. По какой-то причине он не работает в режиме ONE. –

+0

dropboxController вызывает restclient, очень сложно сказать, не видя весь ваш проект, но, надеюсь, вы сможете получить правильный ответ на вашу проблему. –