2011-05-10 9 views
5

Jestem trochę sfrustrowany dzięki API DropBox. Wszystko ma być proste i proste, ale muszę jeszcze przejść proste i proste wyjaśnienie, jak przeprowadzić prostą synchronizację.Prosta synchronizacja z iPhone DropBox API

Postępowałem zgodnie ze wszystkimi instrukcjami, które można znaleźć w pliku readme, który jest dołączony do API Dropbox. Aby przetestować całą sytuację, stworzyłem dwa przyciski do pobrania i przesłania pliku z lub do mojego Dropbox. Pliki znajdują się w folderze Moje dokumenty aplikacji.

Działa to doskonale:

-(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]; 
} 

Jednak jestem teraz zastanawiasz się, jak osiągnąć po prostu synchronizację. Teraz mogę ręcznie przesyłać i pobierać. Ale to, co potrzebne, aby zsynchronizować jest:

  • dowiedzieć się, czy MyExample.txt w moim folderze aplikacji lub w moim folderze Dropbox jest nowsza
  • jeśli txt w folderze app jest nowsza: upuść go do Dropbox (przesłanianie życia), czyli wywołać moja metoda DBupload
  • jeśli txt w skrzynce jest nowsza: pobierz go do folderu apps, czyli wywołać moja metoda DBdownload

Może jestem po prostu zbyt głupie, ale robi dropbox, gdzieś, jak to osiągnąć, raczej prosto i prosto zadanie?

Wiem, że jest this, ale tak naprawdę nie daje żadnych próbek kodu.

Dzięki za wszelkie sugestie.


EDIT

OK, więc pomyślałem, że mój pierwszy krok, aby dowiedzieć się daty ostatniej modyfikacji MyExample.txt który znajduje się w Dropbox.

pisałem wspaniałą metodę zwaną DBSync, w którym po prostu umieścić to polecenie:

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

} 

To wywołuje następujące metody, która pobiera metadane. To było sugerowane odpowiedzi do tego wpisu, a ja skomentował ją nieco na zewnątrz, tak aby zwykły, co się dzieje (jeśli istnieją bardziej głupi ludzie tacy jak ja:

- (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*/ 
      } 
     } 
    } 
} 

będę pisać kolejny krok raz udało się to zrobić ...

Odpowiedz

2

myślę co szukasz jest metoda loadmetadata Oto przykład niesprawdzone.

- (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

Wielkie dzięki. Odpowiednio zaktualizowałem swój post. Zanim zaakceptuję twoją odpowiedź, po prostu pytanie: musi być, jeśli ([nazwa pliku ... zamiast (! [Nazwa pliku ... tak?) Przypuszczam, że to był tylko literówka. plik lokalny? Twoja pomoc byłaby bardzo doceniana. Jesteśmy tylko kilka kroków od dobrego samouczka, jak przeprowadzić prostą synchronizację ... –

+0

nie martw się o porównanie dat, po prostu wymyśli jak to zrobić. Zaktualizuje mój post odpowiednio. –

0

nie trzeba moduł wyliczający, wystarczy użyć stare dobre dla ... loop;)

- (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*/ 
      } 
     } 
    } 
} 
Powiązane problemy