2011-05-10 11 views
5

DropBox APIに少し不満があります。シンプルでストレートなものであるはずですが、シンプルなシンクを簡単に行う方法についてはまだ説明していません。iPhone DropBox APIとのシンプルな同期

私は、DropBox APIに付属のreadmeに記載されているすべての指示に従っています。すべてをテストするために、DropBoxからファイルをダウンロードしてアップロードするための2つのボタンを作成しました。ファイルは私のアプリケーションドキュメントフォルダにあります。

これは見事に動作します。しかし、私は今、単純に同期を達成する方法を疑問に思って

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

を。今、私は手動でアップロードしてダウンロードできます。アプリケーションのフォルダ内のtxtが、より最近のものであるならば私のアプリのフォルダ内または私のDropboxフォルダ内のMyExample.txtが

  • より最近のものであるかどうかを調べる

    • :しかし、私は同期するために必要なことにあります。 Dropboxのにドロップします(古いを上書き)、ドロップボックス内のtxtが、より最近のものである場合、すなわち、私DBupload方法
    • 呼び出します。つまり、おそらく、私は

    私DBdownloadメソッドを呼び出し、アプリのフォルダにそれをダウンロードしてくださいちょうどあまりにも愚かではなく、ドロップボックスの詳細どこかにこれを達成するためにどのように単純で、まっすぐ進む 仕事?

    私はthisがあることを知っていますが、実際にはコードサンプルを提供していません。

    ありがとうございます。


    EDIT

    OK、私は私の最初のステップは、Dropboxの中で発見されたMyExample.txtの最終更新日時を見つけることであることを考え出し。

    私は単純に、このコマンドを入れている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

    私は、あなたが探していることは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

    ありがとうございました。それに応じて自分の投稿を更新しました。私はあなたの答えを受け入れる前に、それはちょうど質問である必要があります:それはif([fileName ...ではなく、if(![fileName ... right?私はそれがちょうどタイプミスだったと思います。ローカルファイルですか?あなたの助けはこれで非常に高く評価されるでしょう。私たちは単純な同期を行う方法についての良いチュートリアルからいくつかのステップを離れています... –

    +0

    日付の比較について心配することはありません、ちょうどそれを行う方法を考え出します。それに応じて自分の投稿を更新します。 –

    0

    あなたが列挙子を必要としない、ただのための古き良きを使用します...ループ;)

    - (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*/ 
          } 
         } 
        } 
    } 
    
    関連する問題