私は自分のプロジェクトにicloudを追加する作業をしていて(これは非常に苦痛です)、ファイルを保存および削除することはできますが、iCloudに保存されているファイルのリストを取得できません。私は約10の異なるWebサイト(Appleのドキュメントを含む)からの解決策を試しました。私が呼び出すときはいつでも、[self.query startQuery];
すべてが機能しているように見えます。正しいメソッドが呼び出されると、メソッドは正しく実行されます。次に、アプリのiCloud Documentsディレクトリにあるファイルのnsarrayを要求すると、間に何もない2つの括弧が表示されます(NSLogで表示した場合)File List: ( )
。私はiCloudDeveloperを使用しているので、アプリのiCloud Documentsディレクトリには、すべての形、拡張子、サイズ、名前のさまざまなドキュメントがあることを知っています。物事が機能しているかどうかを確認するサイト。クエリを設定する最初の方法は次のとおりです。
- (void)syncWithCloud {
self.query = [[NSMetadataQuery alloc] init];
NSURL *mobileDocumentsDirectoryURL = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil];
[query setSearchScopes:[NSArray arrayWithObjects:NSMetadataQueryUbiquitousDocumentsScope, nil]];
//[query setPredicate:[NSPredicate predicateWithFormat:@"%K LIKE '*'", NSMetadataItemFSNameKey]];
[query setPredicate:[NSPredicate predicateWithFormat:[NSString stringWithFormat:@"%%K like \"%@*\"", [mobileDocumentsDirectoryURL path]], NSMetadataItemPathKey]];
//Pull a list of all the Documents in The Cloud
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(processFiles:)
name:NSMetadataQueryDidFinishGatheringNotification object:self.query];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(processFiles:)
name:NSMetadataQueryDidUpdateNotification object:self.query];
[self.query startQuery];
}
Appleが提供するプロセスファイルの方法は次のとおりです。
- (void)processFiles:(NSNotification*)aNotification {
NSMutableArray *discoveredFiles = [NSMutableArray array];
//Always disable updates while processing results.
[query disableUpdates];
//The query reports all files found, every time.
NSArray *queryResults = [query results];
for (NSMetadataItem *result in queryResults) {
NSURL *fileURL = [result valueForAttribute:NSMetadataItemURLKey];
NSNumber *aBool = nil;
// Don't include hidden files.
[fileURL getResourceValue:&aBool forKey:NSURLIsHiddenKey error:nil];
if (aBool && ![aBool boolValue])
[discoveredFiles addObject:fileURL];
}
//Update the list of documents.
[FileList removeAllObjects];
[FileList addObjectsFromArray:discoveredFiles];
//[self.tableView reloadData];
//Reenable query updates.
[query enableUpdates];
NSLog(@"File List: %@", FileList);
}
なぜこれは私にファイルのリストまたは少なくともある種のデータを与えないのですか?NSMetadataクエリの定義が間違っていますか?述語が正しくフォーマットされていない可能性がありますか?iCloudがこれほど複雑になることはないので、私は何か間違ったことをしていることを知っています(またはそれは可能ですか?)。
よろしくお願いします!
編集#1:私はこの問題に対してさまざまなアプローチを試み続けています。以下の回答の1つを使用して、述語フィルターを次のように変更しました。
[query setPredicate:[NSPredicate predicateWithFormat:@"NSMetadataItemFSNameKey LIKE '*'"]];
また、呼び出しの前に次の行を追加しました。[query enableUpdates]
for (NSMetadataItem *item in query.results) {
[FileList addObject:[item valueForAttribute:NSMetadataItemFSNameKey]];
}
このprocessFiles
メソッドでは、すべてのコードをバックグラウンドスレッドに配置しようとしましたが、これは違いはありません。実際のところ、コードがバックグラウンドスレッドで実行されない場合は、FileList
これ(null)
の代わりにこれが表示され( )
ます。
私の問題はスレッド管理またはメモリ割り当てに関係している可能性がありますか?私はARCを使用していることに注意してください。
編集#2:変数はmyで定義され、メソッドを呼び出す前にメソッドで初期化FileList
されたNSMutableArrayです。@interface
-(id)init
processFiles
編集#3:ブレークポイントを使用してコードをテストすると、次のforループが一度も実行されないことがわかりました。これにより、次のように信じることができます
。A.適切なディレクトリが接続されていないB.iCloudが
ディレクトリ内のファイルを
認識できないC.NSMetadataQueryが適切に設定されていないD.まったく異なるもの
実行されないforループを開始するコードは次のとおりです。
NSArray *queryResults = [query results];
for (NSMetadataItem *result in queryResults) {