2011-10-24 14 views
6

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

iCloud's Mobile Documents

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); 
    } 

} 

Respuesta

0

Yo tenía un aspecto en "Administración de almacenamiento" en los Ajustes iClouds en Mac OS X Lion. Cuando hago clic en mi aplicación, solo se muestran los diferentes archivos de texto (más versiones conflictivas) y no hay directorios en absoluto. Por lo tanto, tengo que suponer que solo puedes trabajar con envoltorios/paquetes de archivos pero no con directorios.

+0

¿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

+0

@ nacho4d no, al final no fui con carpetas, lo siento. Como dices, esto puede cambiar con M Lion. Mantenme informado si encuentras una manera. –

+2

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

Cuestiones relacionadas