Простая синхронизация с iPhone DropBox API - PullRequest
5 голосов
/ 10 мая 2011

Я немного разочарован API DropBox.Предполагается, что все будет просто и понятно, но мне еще предстоит найти простое и понятное объяснение того, как сделать простую синхронизацию.

Я следовал всем инструкциям, которые вы можете найти в readme, который поставляется с DropBox API.Чтобы проверить все это, я создал две кнопки для загрузки и загрузки файла из или в мой DropBox.Файлы находятся в папке с документами моего приложения.

Это прекрасно работает:

    -(void) DBupload:(id)sender
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; // Get documents directory
    NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"MyExample.txt"];
    // NSError *error;
    [self.restClient uploadFile:@"MyExample.txt" toPath:@"/MyExamplePath" fromPath:filePath];
}

-(void) DBdownload:(id)sender
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; // Get documents directory
    NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"MyExample.txt"];
    NSError *error;
    [self.restClient loadFile:@"/myExamplePath/MyExample.txt" intoPath:filePath];
}

Однако мне сейчас интересно, как добиться простой синхронизации.Прямо сейчас я могу загрузить и загрузить вручную.Но для синхронизации мне нужно:

  • выяснить, является ли файл MyExample.txt в папке моего приложения или в папке DropBox более поздним
  • , если текст вПапка приложения более новая: поместите ее в dropbox (переопределяя старый), т.е. вызовите мой метод DBupload
  • , если текст в выпадающем списке более поздний: загрузите его в папку приложений, т.е. вызовите мой метод DBdownload

Возможно, я просто слишком глуп, но где-нибудь в DropBox подробно описывается, как выполнить эту довольно простую и прямолинейную задачу?

Я знаю, что есть это но это не дает никаких примеров кода.

Спасибо за любые предложения.


РЕДАКТИРОВАТЬ

ОК, поэтому я решил, что мой первый шаг - выяснить дату последнего измененияMyExample.txt, который находится в dropBox.

Я написал замечательный метод, названный DBsync, в который я просто поместил эту команду:

 -(void) DBsync
{
    [self.restClient loadMetadata:@"/myExamplePath"];

}

Это вызывает следующий метод, который получает метаданные,Это был предложенный ответ на этот пост, и я прокомментировал его немного, чтобы было ясно, что происходит (если есть такие глупые люди, как я:

 - (void)restClient:(DBRestClient*)client loadedMetadata:(DBMetadata*)metadata {

    NSLog(@"restClient:loadedMetadata function called");

    NSEnumerator *e= [metadata.contents objectEnumerator]; // indexes files in dropbox?
    DBMetadata *dbObject;   // loads metadate we need, e.g. lastModifiedDated
    int numberOfFiles = [metadata.contents count]; // counts files in DropBox - I guess we don't really need this
    NSLog(@"numberOfFiles %i", numberOfFiles); 

    while ((dbObject = [e nextObject])) { // this goes through every single file in the DropBox
        if (!dbObject.isDirectory) { // this determines whether we are talking about a file or a folder
            NSString *fileName = [dbObject.path lastPathComponent]; // this puts the name of the last component, e.g. in /MyExamplePath/MyExample.txt = MyExample.txt into fileName
            NSLog(@"File which is currently being checked: %@", fileName);

            if ([fileName isEqualToString:@"MyExample.txt"]) {  

                NSLog(@"Found it: %@", fileName);
                NSLog(@"Date last modified: %@", dbObject.lastModifiedDate); 

                /* to do: call dbupload if dbObject.lastModifiedDate > than your local file*/
            }
        }
    }
}

Я опубликую следующий шагоднажды мне удалось это сделать ...

Ответы [ 2 ]

2 голосов
/ 10 мая 2011

Я думаю, что вы ищете метод loadmetadata.Вот непроверенный пример:

- (void)restClient:(DBRestClient*)client loadedMetadata:(DBMetadata*)metadata {
    NSEnumerator *e= [metadata.contents objectEnumerator];
    DBMetadata *dbObject;
    numberOfFiles = [metadata.contents count];
    while ((dbObject = [e nextObject])) {
    if (!dbObject.isDirectory) {
        NSString *fileName = [dbObject.path lastPathComponent];
        if (![fileName isEqualToString:@"MyExample.txt"]) {  
           /* call dbupload if dbObject.lastModifiedDate > than your local file*/
        }
    }
}
0 голосов
/ 08 октября 2014

Вам не нужен перечислитель, просто используйте старый добрый цикл for ...;)

- (void)restClient:(DBRestClient *)client loadedMetadata:(DBMetadata *)metadata {
    for (DBMetadata * child in metadata.contents) {
        if (!child.isDirectory) {
            NSString *fileName = [dbObject.path lastPathComponent];
            if (![fileName isEqualToString:@"MyExample.txt"]) {  
                /* call dbupload if dbObject.lastModifiedDate > than your local file*/
            }
        }
    }
}
...