0

我正在执行此代码以从 iCloud 获取文件/文档

NSMetadataQuery *metadataQuery = [[NSMetadataQuery alloc] init];
[metadataQuery setSearchScopes:
     [NSArray arrayWithObject:
      NSMetadataQueryUbiquitousDocumentsScope]];

[metadataQuery setPredicate:[NSPredicate predicateWithFormat:@"%K LIKE 'myfile.zip'", NSMetadataItemFSNameKey]];

[[NSNotificationCenter defaultCenter]
     addObserver:self
     selector:@selector(metadataQueryDidFinishGathering:)
     name:NSMetadataQueryDidFinishGatheringNotification
     object:metadataQuery];

 if (![metadataQuery startQuery]) {
        NSLog(@"Start query not work for some reason.");
 }

我收到此错误

 [default] [ERROR] notify_get_state(241) failed with 'invalid_token' (2) for 'user.uid.501.BRNotificationServerAvailabilityChanges'

由于此错误,它不会触发

NSMetadataQueryDidFinishGatheringNotification

通知中心。

任何人以前都面临过这样的问题。

4

2 回答 2

1

我遇到了同样的问题并弄清楚出了什么问题。该错误基本上意味着该NSMetadataQuery变量在函数完成时在它实际完成收集信息之前被释放。您可以通过将元数据查询声明为类的属性来解决。

class UbiquitousFileManager {
    private var metadata: NSMetadataQuery?
    
    func retrieve() {
        self.metadata = NSMetadataQuery()
        self.metadata!.predicate = NSPredicate(format: "%K like %@", NSMetadataItemFSNameKey, "somefile.txt")
        self.metadata!.searchScopes = [NSMetadataQueryUbiquitousDocumentsScope]

        NotificationCenter.default.addObserver(
            forName: .NSMetadataQueryDidFinishGathering,
            object: self.metadata!,
            queue: nil,
            using: { notification in
                // Do something with the result...
         })

        self.metadata!.start()
    }
}

也不要忘记将管理器实例保留为UIViewController等的属性。

final class SomeViewController: UIViewController {
    private let manager = UbiquitousFileManager()
}
于 2021-04-18T12:18:40.800 回答
0

我遇到了同样的问题。

我最终发现的是,如果我在一个独立的类中运行代码,即使是从 NSObject 派生的,我也会得到那个错误。

一旦我将代码移动到 UIViewController 类中,它就可以工作。

但是,仍然不知道原因是什么。

于 2020-07-14T13:20:53.237 回答