【问题标题】:Xcode - Dropbox - NSMutabledictionaryXcode - Dropbox - NSMutabledictionary
【发布时间】:2015-05-10 12:26:32
【问题描述】:

我正在遍历用户的 Dropbox 内容(使用加载的MetaData 委托),以获取有关用户 Dropbox 中存在的所有文件和文件夹名称的信息(我需要这个,以便将所有必要的数据下载到 Documents 文件夹的应用程序供离线使用)。信息应存储在 NSMutabledirectionary 中,其中“key = 文件夹名称”,并且对象始终是包含文件夹内所有文件的数组。我正在这样做:

-(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。字典包含对对象的引用。如果你想要唯一的值,你需要唯一的对象。
  • 嘿,我看到了我的问题,但我想知道如何创建唯一对象:如果我事先不知道每个不同用户需要多少变量,我就无法分配变量。 .. 你知道我的意思吗?
  • 根据需要分配它们。不需要全局指针——只需在本地分配,放入字典,然后就可以完成了。
  • 抱歉,我很抱歉,您能否提供一个快速的代码示例?这正是我的问题......数组需要一个名称,对吧(NsArray *fileListx = etc)?但是如何动态分配 fileList1、fileList2、fileList3(100 个文件夹意味着 fileList99...)。认为我在这里遗漏了一些重要的东西 ;-) 谢谢!
  • iOS 对象没有名称。指针有名字,而不是它们指向的东西。这是基本的面向对象编程的东西,在你开始使用 Objective-C 之前你应该先冷静下来。

标签: ios dropbox-api


【解决方案1】:

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

我还做了一些清理工作:

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

再一次,我根本没有测试过这段代码(而且我的 Objective-C 不是很好),所以可能存在错误/错别字。其他人应随时提出修改建议:

-(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 端点。

【讨论】:

  • 非常感谢!这就是我需要的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多