2014-10-29 5 views
6

Bir dosya seçmek için UIDocumentPicker kullanıyorum ancak büyükse biraz zaman alabilir ve bu özellikle kullanıcılar için iyi bir deneyim değildir.iOS'a iCloud Drive'dan bir dosya indirmesini ve ilerleme geri bildirimi almasını söylerim

Apple'ın iCloud programlama kılavuzuna baktım ve bir dosyayı nasıl indireceğimi ve bazı ilerleme geri bildirimleri aldığımı anlayamıyorum, belgeler çok belirsiz. NSMetadataItems ile bir şeyler yapmam gerektiğini biliyorum, ama aslında bir tane nasıl elde edeceğini ve kullanacağını pek açıklayan bir şey yok.

Birisi bana açıklayabilir mi?

P.S. benden daha yüksek reposu olan birisi bu gönderiyi UIDocumentPicker ve iCloudDrive ile etiketleyebilir mi? Bildiğim kadarıyla

+1

Belirli bir dosyayı bulmak istiyorsanız http://stackoverflow.com/a/23593943/4034301 yararlı –

cevap

7

, sadece sadece 3 durumlarını içerir Ubiquitous Item Downloading Status Constants kullanarak ilerleme geribildirim alabilirsiniz:

  • NSURLUbiquitousItemDownloadingStatusNotDownloaded

    • NSURLUbiquitousItemDownloadingStatusCurrent
    • NSURLUbiquitousItemDownloadingStatusDownloaded

    Yani yapamazsın nicel bir ilerleme geri bildirimi var, sadece kısmi aka indirilen veya değil.

    Bunun için hazırladığınız ve NSMetadataQuery başlatın bazı gözlemciler ekleyip NSURLUbiquitousItemDownloadingStatusKey tuşunu kullanarak sizin NSMetadataItem indirilmesi durumunu kontrol etmek gerekir. Bir NSMetadataQuery dan Sonra

    self.query = [NSMetadataQuery new]; 
    self.query.searchScopes = @[ NSMetadataQueryUbiquitousDocumentsScope ]; 
    self.query.predicate = [NSPredicate predicateWithFormat:@"%K like '*.yourextension'", NSMetadataItemFSNameKey]; 
    
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(queryDidUpdate:) name:NSMetadataQueryDidUpdateNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(queryDidFinishGathering:) name:NSMetadataQueryDidFinishGatheringNotification object:nil]; 
    
    [self.query startQuery]; 
    

    ,

    - (void)queryDidUpdate:(NSNotification *)notification 
    { 
        [self.query disableUpdates]; 
    
        for (NSMetadataItem *item in [self.query results]) { 
         NSURL *url = [item valueForAttribute:NSMetadataItemURLKey]; 
         NSError *error = nil; 
         NSString *downloadingStatus = nil; 
    
         if ([url getResourceValue:&downloadingStatus forKey:NSURLUbiquitousItemDownloadingStatusKey error:&error] == YES) { 
          if ([downloadingStatus isEqualToString:NSURLUbiquitousItemDownloadingStatusNotDownloaded] == YES) { 
           // Download 
          } 
          // etc. 
         } 
        } 
    
        [self.query enableUpdates]; 
    } 
    
  • +0

    yüzden, sadece yapabilirsiniz Bunu yüklemede kullanın? – Weston

    +0

    Evet, belirli bir adı, uzantı, yol, boyut, oluşturma tarihi veya [özellik anahtarlarında] tanımlanan herhangi bir öğeyle ilgili tüm dosyaları arayabilirsiniz (https://developer.apple.com/library/ios/documentation/Cocoa NSMetadataItem'den /Reference/Foundation/Classes/NSMetadataItem_Class/index.html#//apple_ref/doc/constant_group/Attribute_Keys). Bir örnek eklemek için cevabımı düzenledim. – HiDeo

    +0

    Bir soru daha, neden güncellemeleri kapatıyorsunuz, sonra tekrar açıyorsunuz? – Weston

    1

    İlerleme geribildirim bildirimleri olur. Güncelleme sıklığı, varsayılan olarak saniyede birdir (notificationBatchingInterval ayarlanarak değiştirilebilir). Güncelleştirilmiş nesneler, bildirimin NSMetadataItem dizisi olarak userInfo dict biçiminde kapsüllenir. İndirme geri bildirimi, her bir öğenin NSMetadataUbiquitousItemPercentDownloadedKey numaralı anahtarında saklanır. Diziler dahili olarak değişebilir olduğundan sonuçları sıralarken güncellemeleri devre dışı bırakmak için NSMetadataQuery'a söylememiz gerekir. Bu önemlidir, aksi halde garip çökmeler meydana gelir.

    Tipik bir uygulama aşağıdaki gibi görünebilir:

    - (void) queryDidUpdate:(NSNotification *)notification { 
    
    [self.mdQuery disableUpdates];// we don't want to receive a new update while we still process the old one 
    
    NSArray *addedItems  = notification.userInfo[NSMetadataQueryUpdateAddedItemsKey]; 
    NSArray *remItems  = notification.userInfo[NSMetadataQueryUpdateRemovedItemsKey]; 
    NSArray *changedItems = notification.userInfo[NSMetadataQueryUpdateChangedItemsKey]; 
    
    // add 
    for (NSMetadataItem *mdItem in addedItems) { 
        NSURL *url   = [mdItem valueForKey:NSMetadataUbiquitousItemURLInLocalContainerKey]; 
        // do something... 
    } 
    // remove 
    for (NSMetadataItem *mdItem in remItems) { 
        NSURL *url   = [mdItem valueForKey:NSMetadataUbiquitousItemURLInLocalContainerKey]; 
        // do something... 
    } 
    // change 
    for (NSMetadataItem *mdItem in changedItems) { 
        NSURL *url   = [mdItem valueForKey:NSMetadataUbiquitousItemURLInLocalContainerKey]; 
         // uploading 
         BOOL uploading = [(NSNumber *)[mdItem valueForKey:NSMetadataUbiquitousItemIsUploadingKey] boolValue]; 
         if (uploading) { 
          NSNumber *percent = [mdItem valueForKey:NSMetadataUbiquitousItemPercentUploadedKey]; 
          cell.progressView.progress = percent.floatValue; 
          // do something... 
         } 
         // downloading 
         BOOL downloading = [(NSNumber *)[mdItem valueForKey:NSMetadataUbiquitousItemIsDownloadingKey] boolValue]; 
         if (downloading) { 
          NSNumber *percent = [mdItem valueForKey:NSMetadataUbiquitousItemPercentDownloadedKey]; 
          cell.progressView.progress = percent.floatValue; 
          // do something... 
         } 
        } 
    [self.mdQuery enableUpdates]; 
    } 
    
    İlgili konular