OS X アプリを iCloud ドキュメントへの変更から自動的に更新しようとしていますが、通知を受け取るのに非常に苦労しています。具体的には、私のすべての結果をリストするコードが与えられましたがNSMetadataQuery
(テストと確認を行うことができるように)、0 の結果が返されます。これは、データが OS X アプリから正常にアップロードされ、起動時に再度正常にダウンロードされているため、ユビキタス コンテナーに明らかに何かが存在するという事実にもかかわらずです。これが私が今持っているものです。
CloudDocument.h:
@property (nonatomic, strong) NSMetadataQuery *alertQuery;
CloudDocument.m:
@implementation CloudDocument
@synthesize alertQuery;
-(id)init {
self = [super init];
if (self) {
alertQuery = [[NSMetadataQuery alloc] init];
if (alertQuery) {
// Search the Documents subdirectory only.
[alertQuery setSearchScopes:[NSArray arrayWithObject:NSMetadataQueryUbiquitousDocumentsScope]];
// Add a predicate for finding the documents.
NSString *filePattern = @"*";
[alertQuery setPredicate:[NSPredicate predicateWithFormat:@"%K LIKE %@", NSMetadataItemFSNameKey, filePattern]];
}
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(queryDidUpdate:) name:NSMetadataQueryDidFinishGatheringNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(queryDidUpdate:) name:NSMetadataQueryDidUpdateNotification object:nil];
NSLog(@"Notification created");
[alertQuery startQuery];
}
return self;
}
-(void)queryDidUpdate:(NSNotification *)notification {
[alertQuery disableUpdates];
NSLog(@"Something changed!!! - %@", [notification name]);
// Look at each element returned by the search
// - note it returns the entire list each time this method is called, NOT just the changes
int resultCount = (int)[alertQuery resultCount];
NSLog(@"%i", resultCount);
for (int i = 0; i < resultCount; i++) {
NSMetadataItem *item = [alertQuery resultAtIndex:i];
[self logAllCloudStorageKeysForMetadataItem:item];
}
[alertQuery enableUpdates];
}
- (void)logAllCloudStorageKeysForMetadataItem:(NSMetadataItem *)item {
NSLog(@"LogAll gets called");
NSNumber *isUbiquitous = [item valueForAttribute:NSMetadataItemIsUbiquitousKey];
NSNumber *hasUnresolvedConflicts = [item valueForAttribute:NSMetadataUbiquitousItemHasUnresolvedConflictsKey];
NSNumber *isDownloaded = [item valueForAttribute:NSMetadataUbiquitousItemIsDownloadedKey];
NSNumber *isDownloading = [item valueForAttribute:NSMetadataUbiquitousItemIsDownloadingKey];
NSNumber *isUploaded = [item valueForAttribute:NSMetadataUbiquitousItemIsUploadedKey];
NSNumber *isUploading = [item valueForAttribute:NSMetadataUbiquitousItemIsUploadingKey];
NSNumber *percentDownloaded = [item valueForAttribute:NSMetadataUbiquitousItemPercentDownloadedKey];
NSNumber *percentUploaded = [item valueForAttribute:NSMetadataUbiquitousItemPercentUploadedKey];
NSURL *url = [item valueForAttribute:NSMetadataItemURLKey];
BOOL documentExists = [[NSFileManager defaultManager] fileExistsAtPath:[url path]];
NSLog(@"isUbiquitous:%@ hasUnresolvedConflicts:%@ isDownloaded:%@ isDownloading:%@ isUploaded:%@ isUploading:%@ %%downloaded:%@ %%uploaded:%@ documentExists:%i - %@", isUbiquitous, hasUnresolvedConflicts, isDownloaded, isDownloading, isUploaded, isUploading, percentDownloaded, percentUploaded, documentExists, url);
}
-(NSData *)dataOfType:(NSString *)typeName error:(NSError **)outError {
[Data setSyncProgressIndicators:NO];
return [NSKeyedArchiver archivedDataWithRootObject:[Data getAllNotes]];
}
-(BOOL)readFromData:(NSData *)data ofType:(NSString *)typeName error:(NSError **)outError {
[Data setSyncProgressIndicators:YES];
NSDictionary *dict = (NSDictionary *)[NSKeyedUnarchiver unarchiveObjectWithData:(NSData *)data];
[Data didReceiveCloudData:dict];
[Data setSyncProgressIndicators:NO];
return YES;
}
+(BOOL)autosavesInPlace {
return YES;
}
@end
私が見ている結果はqueryDidUpdate:
、起動時に 2 ~ 3 回呼び出されることですNSMetadataQueryDidFinishGatheringNotification
。つまり、「resultCount」変数は常に 0 であるため、クラウド ドキュメントを頻繁に編集しても、呼び出されることはなく、まったく呼び出されることもlogAllCloudStorageKeysForMetadataItem
ありません。NSMetadataQueryDidUpdateNotification
ファイルが同期されていることが明らかであるにもかかわらず、検索が 0 の結果を返す理由について誰かアドバイスをいただけますか? NSMetadataQueryDidUpdateNotification
または、さらに良いことに、コード全体のどこが間違っているのか、ファイルに編集があったときに軌道に乗って通知するために何ができるかを確認できますか? 次の方法を使用して、ファイルを保存しています。
+(NSURL *)notesURL {
NSURL *url = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil];
return [url URLByAppendingPathComponent:kAllNotes];
}
ここで、「kAllNotes」=「メモ」。
よろしくお願いします。
編集: 正常に同期していると言っても、NSMetadataQuery のために同期していないことに注意してください。CloudDocument をロードするcloudDoc = [[CloudDocument alloc]initWithContentsOfURL:[self notesURL] ofType:NSPlainTextDocumentType error:nil];
行が別の場所にあるので、そこにドキュメントがあり、アプリの iOS バージョンによって変更されていることはわかっていますが、今マスターしようとしている NSMetadataQuery は、そこにあるだけです。で動作しますがNSMetadataQueryDidUpdateNotification
、どれも正しく機能していないようです。
また、私は間違いなく初心者なので、提案を行う際のコードスニペットと例は非常に高く評価されています!