在尝试解决此问题时,我已经感到头痛:在我当前的应用程序中,我使用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文件的方式如上所述适用于新文件,但似乎还需要修改现有文件。
但是,无论如何,如何重复运行查询机制?
干杯...
答案 0 :(得分:3)
经过一番努力调查后,我找到了一个非凡的解决方案。因此,如果其他人磕磕绊绊,我只是分享我的经验:
这似乎就是全部。现在它似乎有效。