Xcode - Dropbox - NSMutabledictionary

Xcode - Dropbox - NSMutabledictionary

我正在遍历用户的 Dropbox 内容(使用 loadedMetaData 委托)以获取有关用户保管箱中存在的所有文件和文件夹名称的信息(我需要它以便我可以将所有必要的数据下载到用于离线使用的应用程序的文档文件夹)。信息应存储在 "key = folder-name" 的 NSMutabledirectionary 中,对象始终是一个包含文件夹内所有文件的数组。我正在这样做:

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

    if (metadata.isDirectory) {
        //subfolders are loaded into array
        for (DBMetadata *directory in metadata.contents) {
            if (directory.isDirectory)
            {
                [directoryList addObject:directory.filename];
                //
            }
        }

        //files are loaded according loadmeta-folder (first run is root folder)
        [fileList removeAllObjects];
        for (DBMetadata *file in metadata.contents) {
            if (!file.isDirectory)
            {
                NSLog(@"Directy is called %@", metadata.path);
                //NSLog(@"%@ was last changed %@", file.filename, file.lastModifiedDate);
                [fileList addObject:file.filename];
                [fileRevisionDates addObject:file.lastModifiedDate];
            }
        }
        NSLog(@"Key is called %@", metadata.path);


        //This is where I store the information in the dictionary
        [subFolderContent setValue:fileList forKey:metadata.path];
        //loadmetadata for all sub-folders
        for (int i = 0; i < directoryList.count; i++) {
            [restClient loadMetadata:[NSString stringWithFormat:@"/TestFolder/%@/", [directoryList objectAtIndex:i]]];
        }
    }
}

现在这基本上可以工作了,但是当然,每次更新数组 "fileList" 时,字典中每个键的所有值都会相应更新......我错过了什么?还是有更好的方法来实现?

感谢您的帮助! 汤姆

这里有一些粗略的代码,可能 有效。 (我根本没有测试过。)要回答你的直接问题,请注意我正在用这个方法初始化一个新的 fileList 而不是在其他地方有一个全局的。这就是上面评论者的意思。

我也做了一点清理:

  1. 无需将目录列表保存在一个数组中,然后再对每个目录调用 loadMetadata。您可以在看到的每个目录上调用 loadMetadata
  2. 我删除了 fileRevisionDates,因为它在当前状态下似乎不可用。 (我猜它实际上是一个日期数组?你可能需要一个 NSMutableDictionary。)
  3. 我修复了对 loadMetadata 的递归调用的路径构造。如果用户的 Dropbox 包含像 /foo/bar/baz 这样的目录,看起来您的代码会尝试在像 /TestFolder/baz 这样的路径上获取元数据。我想我所做的改变会解决这个问题。

同样,我根本没有测试过这段代码(而且我的Objective-C也不是很好),所以可能会有bugs/typos。其他人应该随时提出修改建议:

-(void)restClient:(DBRestClient *)client loadedMetadata:(DBMetadata *)metadata {
    if (metadata.isDirectory) {
        NSMutableArray *fileList = [[NSMutableArray alloc] init];
        for (DBMetadata *entry in metadata.contents) {
            if (entry.isDirectory) {
                [restClient loadMetadata:[NSString stringWithFormat:@"%@/%@", metadata.path, entry.filename]];
            }
            else {
                [fileList addObject:entry.filename];
            }
        }
        [subFolderContent setValue:fileList forKey:metadata.path];
    }
}

最后,请注意,这不是枚举用户 Dropbox 内容的好方法。有关首选方法,请参阅 https://blogs.dropbox.com/developers/2013/12/efficiently-enumerating-dropbox-with-delta/,即使用 /delta 端点。