2011-10-24 40 views
6

Kullanıcı veya uygulama tarafından iCloud'un Mobil Belgeler dizininde oluşturulan bir dizinde okumak istiyorum./Mobil Belgeler). iCloud: Kullanıcı tarafından oluşturulan dizinlerde nasıl okunur?

iCloud's Mobile Documents

Aşağıdaki kodu denedim ama çalıştırmak sorgu (NSPredicate predicateWithFormat:@"%K.pathExtension = ''", NSMetadataItemFSNameKey kullanarak) benim klasörleri temsil herhangi bir nesneyi içermez: İşte bu dizin gibi görünebilir nasıl bir örnektir. Txt dosyaları için bir sorgu çalıştırırsam ( @"%K ENDSWITH '.txt'", NSMetadataItemFSNameKey kullanarak), sırasıyla txt dosyaları için 5 nesne döndürülür. Txt dosyalarını aramak böylece çalışır, ancak dizinler için değil. docs üzerinden okumak, Apple'ın dizinler yerine NSFileWrapper (Dosya Paketleri) kullanmayı önerdiğini fark ettim. ICloud, kullanıcı veya uygulama tarafından oluşturulan dizinleri işleyemez/algılayamaz mı?

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

} 

cevap

0

Mac OS X Lion iClouds Ayarlar "Depolama alanı yönetme" bir göz vardı:

İşte benim kodudur. Uygulamamı tıklattığımda, yalnızca farklı txt dosyalarını (artı çakışan sürümleri) ve hiçbir dizini göstermeyecek. Bu yüzden sadece sarmalayıcılarla/dosya paketleriyle çalışabileceğinizi, ancak dizinlerle çalışamayacağınızı varsaymak zorundayım.

+0

Hiç bu konuda uğraştın mı? Ne yararına olursa olsun, Mountain Lion kullanıcılarında, uygulamanın içindeki Açık panelden klasörler oluşturabilirler. NSMetadataQuery' API'sini orada denediniz mi? Bu bize iOS'ta nasıl değiştiğine dair bir ipucu vermeli ... – nacho4d

+0

@ nacho4d hayır, sonunda klasörlerle gitmedim, üzgünüm. Söylediğiniz gibi, bu M Lion ile değişebilir. Bir yol bulursan beni haberdar et. –

+2

Sadece kayıt için (çünkü zaten fark ettim) Çünkü burada bir çalışma yayınladım: http://stackoverflow.com/questions/7873974/returning-a-list-of-directories-with-nsmetadataquery-and-nspredicate/10510752 # 10510752 – nacho4d

İlgili konular