2011-10-24 10 views
6

Vorrei leggere in un elenco di tutte le directory create dall'utente o dall'app nella directory Documenti mobili di iCloud (quella trovata in Lion sotto ~/Libreria/Documenti mobili). Ecco un esempio di come questa directory potrebbe apparire come:iCloud: Come leggere nelle directory create dall'utente

iCloud's Mobile Documents

Ho provato il seguente codice, ma la query corro non conterrà oggetti che rappresentano le mie cartelle (utilizzando il NSPredicate predicateWithFormat:@"%K.pathExtension = ''", NSMetadataItemFSNameKey). Se eseguo una query per i file txt (usando @"%K ENDSWITH '.txt'", NSMetadataItemFSNameKey), otterrò rispettivamente 5 oggetti restituiti per i file txt. La ricerca di file txt funziona quindi, ma non per le directory. Leggendo lo docs, ho notato che Apple suggerisce di utilizzare NSFileWrapper (Pacchetti file) anziché le directory. ICloud non è in grado di gestire/rilevare le directory create dall'utente o dall'app?

Ecco il mio codice:

-(void)loadDocument { 

    NSMetadataQuery *query = [[NSMetadataQuery alloc] init]; 
    _query = query; 
    //Search all files in the Documents directories of the application’s iCloud container directories: 
    [query setSearchScopes:[NSArray arrayWithObject:NSMetadataQueryUbiquitousDocumentsScope]]; 

    NSPredicate *pred = [NSPredicate predicateWithFormat:@"%K.pathExtension = ''", NSMetadataItemFSNameKey]; 

    [query setPredicate:pred]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(queryDidFinishGathering:) name:NSMetadataQueryDidFinishGatheringNotification object:query]; 
    [query startQuery]; 
} 

- (void)queryDidFinishGathering:(NSNotification *)notification { 

    NSMetadataQuery *query = [notification object]; 
    [query disableUpdates]; // You should invoke this method before iterating over query results that could change due to live updates. 
    [query stopQuery]; // You would call this function to stop a query that is generating too many results to be useful but still want to access the available results. 

    [self loadData:query]; 

    [[NSNotificationCenter defaultCenter] removeObserver:self name:NSMetadataQueryDidFinishGatheringNotification object:query]; 
    _query = nil; // we're done with it 
} 


- (void)loadData:(NSMetadataQuery *)query { 

    NSLog(@"Query count %i", [query resultCount]); 

    for (int i=0; i < [query resultCount]; i++) { 
     NSMetadataItem *item = [query resultAtIndex:i]; 
     NSURL *url = [item valueForAttribute:NSMetadataItemURLKey]; 
     NSLog(@"%i.URL: %@", i, url); 
    } 

} 

risposta

0

ho dato un'occhiata al "Gestisci archiviazione" nelle Impostazioni iClouds in Mac OS X Lion. Quando faccio clic sulla mia applicazione, mostrerò solo i diversi file txt (più versioni in conflitto) e nessuna directory. Quindi devo supporre che tu possa lavorare solo con pacchetti wrapper/file ma non con le directory.

+0

Hai mai lavorato intorno a questo? Per quello che vale, gli utenti di Mountain Lion sono in grado di creare cartelle dal pannello Apri all'interno dell'app. Hai provato l'API 'NSMetadataQuery'? Questo dovrebbe darci un suggerimento su come questo sta cambiando in iOS ... – nacho4d

+0

@ nacho4d no, alla fine non sono andato con le cartelle, mi dispiace. Come dici tu, questo potrebbe cambiare con M Lion. Tienimi aggiornato se trovi un modo. –

+2

Solo per la cronaca (perché penso che tu abbia già notato) ho postato un work-around qui: http://stackoverflow.com/questions/7873974/returning-a-list-of-directories-with-nsmetadataquery-and-nspredicate/10510752 # 10510752 – nacho4d

Problemi correlati