- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在尝试解决这个问题时,我已经很头疼了:在我当前的应用程序中,我使用 iCloud 来存储我的文档 - 但我不能使用基于 UIDocument 的数据存储。所以我的方法是遵循 WWDC 2012 文章 237(高级 iCloud 文档存储)并将我的文档视为鞋盒应用程序。
当我构建一个 NSMetadataQuery 来监视 iCloud 文档文件夹中的更改以监视文件更改时,真正的问题出现了。我已经设置了我的查询,用 NSMetadataQueryDidFinishGatheringNotification 的观察者启动它,当它触发时,我为查询启用更新并为 NSMetadataQueryDidUpdateNotification 设置观察者。后者只对一个文件更改工作一次,我没有找到如何在相同或其他文件的后续更改中重复触发它。以下是部分代码:
- (void)startMonitoringDocumentsFolder: (id)sender
{
if (self.queryDocs != nil)
return;
NSLog(@"startMonitoringDocumentsFolder:");
self.queryDocs = [[NSMetadataQuery alloc] init];
[queryDocs setSearchScopes:[NSArray arrayWithObject:NSMetadataQueryUbiquitousDocumentsScope]];
NSPredicate* pred = [NSPredicate predicateWithFormat:@"%K like '*.nwa' or %K like '*.NWA'", NSMetadataItemFSNameKey, NSMetadataItemFSNameKey];
[self.queryDocs setPredicate:pred];
NSNotificationCenter* center = [NSNotificationCenter defaultCenter];
NSOperationQueue* mainQueue = [NSOperationQueue mainQueue];
// I'm using the blocks version because I'm planning to setup observers for the same tracking name...
self.observeGatherDocs = [center addObserverForName: NSMetadataQueryDidFinishGatheringNotification
object: self.queryDocs
queue: mainQueue
usingBlock: ^(NSNotification* note)
{
[self queryDidFinishGathering:note];
}];
[self.queryDocs startQuery];
}
- (void)queryDidFinishGathering:(NSNotification *)notification
{
NSLog(@"queryDidFinishGathering:");
NSMetadataQuery* query = [notification object];
if (query == queryDocs)
{
NSLog(@"--> for queryDocs");
NSNotificationCenter* center = [NSNotificationCenter defaultCenter];
NSOperationQueue* mainQueue = [NSOperationQueue mainQueue];
[center removeObserver: observeGatherDocs];
self.observeGatherDocs = nil;
self.observeUpdateDocs = [center addObserverForName: NSMetadataQueryDidUpdateNotification
object: query
queue: mainQueue
usingBlock: ^(NSNotification* note)
{
[self queryDidUpdateDocumentsFolder:note];
}];
[query enableUpdates];
}
}
- (void)queryDidUpdateDocumentsFolder:(NSNotification *)notification
{
NSLog(@"queryDidUpdateDocumentsFolder:");
NSMetadataQuery* query = [notification object];
[query disableUpdates];
for (NSMetadataItem* item in [query results])
{
// find and handle file changes here w/out any command calls to the query itself
...
}
if (self.needDownload)
[self triggerDownloadThread];
// ---- BEGIN code part added to solve the problem ---- //
// re-create the observer
NSNotificationCenter* center = [NSNotificationCenter defaultCenter];
NSOperationQueue* mainQueue = [NSOperationQueue mainQueue];
[center removeObserver: observeUpdateDocs];
self.observeUpdateDocs = [center addObserverForName: NSMetadataQueryDidUpdateNotification
object: query
queue: mainQueue
usingBlock: ^(NSNotification* note)
{
[self queryDidUpdateDocumentsFolder:note];
}];
// ---- END code part added to solve the problem ---- //
[query enableUpdates];
// that's all with the query, am I missing something?
}
非常感谢这里的任何建议。
它真正做了什么:
当我直接(通过覆盖)修改 iCloud 文档容器中的文件时 - 没有,查询不会触发。
当我按序列 setUbiquitous:NO 修改文件时,写入本地文件,setUbiquitous:YES 查询触发一次,我检测到更改,当我再次更改同一个文件时,没有召回查询处理程序。
因此,尽管我在 Apple 文档中发现写入 iCloud 文件的方式(如 1. 以上)适用于新文件,但似乎也有必要修改现有文件。
但是,无论如何,我怎样才能使查询机制重复运行呢?
干杯...
最佳答案
经过更多努力调查后,我找到了一个出色的解决方案。因此,如果其他人遇到困难,我只是分享我的经验:
似乎就是这样。现在它似乎工作。
关于ios - 处理基于 NSMetadataQueryDidUpdateNotification 非 UIDocument 的 iCloud 文件的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14045904/
谁能告诉我以下我从 iOS 5 Developer's Cookbook 改编的代码有什么问题 - (void) startMonitoringUbiquitousDocumentsFolder {
为了监控我的iCloud容器中的文件变化,我注册了 [[NSNotificationCenter defaultCenter] addObserver:self
我正在尝试在 OS X 应用程序上启动并运行 NSMetadataQueryDidUpdateNotification,以便在 iCloud 无处不在容器中的文件更新时提醒我。我一直在做很多研究(包括
在尝试解决这个问题时,我已经很头疼了:在我当前的应用程序中,我使用 iCloud 来存储我的文档 - 但我不能使用基于 UIDocument 的数据存储。所以我的方法是遵循 WWDC 2012 文章
我是一名优秀的程序员,十分优秀!