【问题标题】:Dropbox iOS Sync API add observer not called appropriatelyDropbox iOS Sync API 添加未正确调用的观察者
【发布时间】:2014-02-21 03:56:29
【问题描述】:

如果在“路径”文件夹中删除或添加文件,则不会调用以下观察者:

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

那么该方法的意义何在,何时调用?

如果在“路径”的文件夹中删除/添加/修改了任何文件,则会调用以下内容

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

我希望能够区分何时修改文件夹中包含的文件与何时在“路径”文件夹中添加/删除文件。

以下是我用来注册观察者的代码:

#define DATA_FOLDER_NAME @"Portfolio_Data"
DBFilesystem* filesystem = [DBFilesystem sharedFilesystem];
DBPath *portfolioFilesPath = [[DBPath root] childPath:DATA_FOLDER_NAME];

    [filesystem addObserver:self forPath:portfolioFilesPath block:^{

        dispatch_async(dispatch_get_main_queue(), ^{
            [self getPortfoliosData];
        });
    }];

【问题讨论】:

  • 显示你设置观察者的实际代码。

标签: ios dropbox dropbox-api


【解决方案1】:

一些事情。

  1. addObserver:forPath:block: 仅用于跟踪路径中文件的更改。
  2. addObserver:forPathAndChildren:block: 用于跟踪路径中文件夹的更改以及路径中文件内的任何直接子级(但不包括这些子级的子级)。
  3. 要做你想做的事需要更多的工作。要侦听单个文件的更改,您需要为每个文件创建一个 DBFile 并向文件添加一个观察者。当文件被更改或删除时,将调用此观察者。然后你需要使用addObserver:forPathAndChildren:block:(或addObserver:forPathAndDescendants:block:)来监听文件夹内的一般变化。最大的问题是当你的块被调用时,你只知道“某事”发生了变化。您需要扫描文件夹以查找新文件。您可以忽略现有或已删除的文件,因为您为每个文件设置的观察者将在文件更改或删除时被调用。

这是 Dropbox Sync API over iCloud API 的一大缺点。 iCloud 会告诉您文件夹中添加了什么文件,而 Dropbox 不会。

【讨论】:

  • 文档说 addObserver:forPath:block: 会在路径中的文件或文件夹发生更改时通知任何时候,那么我们在谈论文件夹中的哪种更改?我理解这些差异,这就是我所做的。
  • 文件夹更改可能包括重命名文件夹和删除文件夹,但我认为这不包括对文件夹内容的更改。
  • 当您自己进行更改并且观察者被调用时,API 确实表现得很奇怪,例如它可以在新创建的文件上给出一个例外,即使它甚至不是文件夹也无法“打开文件夹”。我只是通过在我自己的更改触发它时不调用我的同步方法来防止此类问题
  • 您似乎在第 3 点建议 addObserver:forPathAndChildren:block: 将在文件夹内容更改时调用,但在例如将新文件添加到文件夹时不会调用
  • @2cupsOfTech 我不建议这样做。 addObserver:forPathAndChildren:block: 在添加新文件以及更改/删除文件时调用。
猜你喜欢
  • 2015-05-11
  • 1970-01-01
  • 1970-01-01
  • 2018-07-22
  • 1970-01-01
  • 2016-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多