如何使用Dropbox Sync API保持目录及其内容同步?

时间:2014-05-01 22:30:20

标签: ios sync dropbox-api

我的应用程序有一个不同的系统,可以让某些数据保持同步。我会在一个简单的文件中跟踪数据,然后使用与此类似的代码与Dropbox保持同步:

DBPath *newPath = [[DBPath root] childPath:[NSString stringWithFormat:@"metadata/%@", tagsFileName]];

NSString *metadata = [(FTIBAppDelegate *)[[UIApplication sharedApplication] delegate] getMetadataPath];
NSString *collectionsFile = [NSString stringWithFormat:@"%@/%@", metadata, tagsFileName, nil];

DBFilesystem *theSystem = [DBFilesystem sharedFilesystem];
if([theSystem completedFirstSync])
{
    NSError *erri = nil;
    if(!file.open)
    {
        file = [[DBFilesystem sharedFilesystem] openFile:newPath error:&erri];
    }

    __block DBFileStatus *newerStatus = file.newerStatus;
    if(newerStatus != nil)
    {
        [file update:nil];
    }
    __block DBFileStatus *status = file.status;

    //__block NSString *contents = [file readString:nil];

    if(erri == nil)
    {
        [file addObserver:self block:^{
            newerStatus = file.newerStatus;
            status = file.status;
            if(status.cached)
            {
                NSString *contents = [file readString:nil];
                [contents writeToFile:collectionsFile atomically:NO encoding:NSUTF8StringEncoding error:nil];
            }

            if(newerStatus != nil)
            {
                NSString *contents = [file readString:nil];
                [file update:nil];
                [contents writeToFile:collectionsFile atomically:NO encoding:NSUTF8StringEncoding error:nil];
            }
        }];
    }
}

观察单个文件非常简单。就像你在上面的代码中看到的那样,我会观察单个文件,然后当它更新时,我会读取文件的内容并在本地写入。

现在我正在尝试观察包含子目录的路径。子目录及其内容可以是变量,因此我无法手动观察每个目录和文件。

我正在查看Dropbox文档,我找到了这个方法:

- (BOOL)addObserver:(id)observer forPathAndDescendants:(DBPath *)path block:(DBObserver)block

其中说:

  

添加一个观察者,以便在路径中的文件夹发生变化时收到通知   包含路径更改下方某处的文件或文件夹。

足够公平。阅读描述看起来它似乎完全我需要观察某条路径下的所有内容。

但问题是:它似乎没有通知我什么文件或文件夹已更改,所以我无法找出Dropbox中已更改的文件,因此我无法覆盖我的本地副本。

到目前为止,我得到了这个:

DBPath *newPath = [[DBPath root] childPath:@"metadata/__MIGNORICOLLECTIONS__"];
NSString *metadata = [(FTIBAppDelegate *)[[UIApplication sharedApplication] delegate] getMetadataPath];
NSString *localPath = [NSString stringWithFormat:@"%@/%@", metadata, @"__MIGNORICOLLECTIONS__"];

DBFilesystem *theSystem = [DBFilesystem sharedFilesystem];
if([theSystem completedFirstSync])
{
    [theSystem addObserver:self forPathAndDescendants:newPath block:^{
    }];
}

但我真的不知道从哪里去。如果该块没有给我更改/正在更改的文件,我无法覆盖我的本地文件并有效地保持Dropbox和我的本地内容同步。

1 个答案:

答案 0 :(得分:1)

如果您需要知道通过Sync API更改了哪些文件,您唯一的选择是在事情发生变化时比较之前和之后。因此,您需要维护有关本地状态的信息,例如本地设备上存在的每个文件的rev,然后在每次更改时将其与新状态进行比较。