1

私は自分のプロジェクトにを追加する作業をしていて(これは非常に苦痛です)、ファイルを保存および削除することはできますが、iCloudに保存されているファイルのリストを取得できません。私は約10の異なるWebサイト(Appleのドキュメントを含む)からの解決策を試しました。私が呼び出すときはいつでも、[self.query startQuery];すべてが機能しているように見えます。正しいメソッドが呼び出されると、メソッドは正しく実行されます。次に、アプリのiCloud Documentsディレクトリにあるファイルのを要求すると、間に何もない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)initprocessFiles

編集#3:ブレークポイントを使用してコードをテストすると、次が一度も実行されないことがわかりました。これにより、次のように信じることができます
。A.適切なディレクトリが接続されていないB.iCloudが
ディレクトリ内のファイルを
認識できないC.NSMetadataQueryが適切に設定されていないD.まったく異なるもの

実行されないforループを開始するコードは次のとおりです。

NSArray *queryResults = [query results];
for (NSMetadataItem *result in queryResults) {
4

2 に答える 2

1

すでに検索範囲を正しく設定しているため、述語で特別なフィルターを使用する必要はありません。使用するだけです:

query.predicate = [NSPredicate predicateWithFormat:@"NSMetadataItemFSNameKey == '*'"];

配列を取得するには、次のようにします。

NSMutableArray *array = [NSMutableArray array];
for (NSMetadataItem *item in query.results) {
        [array addObject:[item valueForAttribute:NSMetadataItemFSNameKey]];
}
于 2013-01-01T22:28:40.593 に答える
0

問題を解決しました。iCloud 内のファイルのリストを取得するには、プロパティを正しく定義、割り当て、初期化するだけで済みました。SAEの回答とこのSO の投稿は、私の問題を解決し、iCloud Document Syncと呼ばれるこの GitHub リポジトリを作成するのに役立ちました。iCloud Document Sync クラスは、iCloud ドキュメントの保存プロセス全体を数行のコードに簡素化します。ここにリンクされているコミットは、私の質問の問題を修正します。

于 2013-01-04T22:48:17.250 に答える