Me gustaría leer en una lista de todos los directorios creados por el usuario o la aplicación en el directorio de documentos móviles de iCloud (el que se encuentra en Lion en ~/Library/Documentos móviles). Aquí está un ejemplo de cómo este directorio podría parecerse a:iCloud: Cómo leer en directorios creados por el usuario
He probado el siguiente código, pero la consulta corro no contendrá ningún objeto que representan mis carpetas (utilizando el NSPredicate predicateWithFormat:@"%K.pathExtension = ''", NSMetadataItemFSNameKey
). Si ejecuto una consulta para archivos txt (usando @"%K ENDSWITH '.txt'", NSMetadataItemFSNameKey
), obtendré 5 objetos devueltos para los archivos txt respectivamente. Buscar archivos txt funciona así, pero no para directorios. Leyendo a través del docs, noté que Apple sugiere usar NSFileWrapper (paquetes de archivos) en lugar de directorios. ¿ICloud no puede manejar/detectar directorios creados por el usuario o la aplicación?
Aquí está mi código:
-(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);
}
}
¿Alguna vez trabajaste rodeado de esto? Por lo que vale, en Mountain Lion los usuarios pueden crear carpetas desde el panel Abrir dentro de la aplicación. ¿Has probado la API 'NSMetadataQuery' allí? Eso debería darnos una pista de cómo esto está cambiando en iOS ... – nacho4d
@ nacho4d no, al final no fui con carpetas, lo siento. Como dices, esto puede cambiar con M Lion. Mantenme informado si encuentras una manera. –
Solo para el registro (porque creo que ya lo has notado) Publiqué una solución alternativa aquí: http://stackoverflow.com/questions/7873974/returnning-a-list-of-directories-with-nsmetadataquery-and-nspredicate/10510752 # 10510752 – nacho4d