2014-10-29 8 views
6

मैं एक फाइल का चयन करने के लिए यूआईडी दस्तावेज़ पिकर का उपयोग कर रहा हूं लेकिन यदि यह बड़ा है तो इसे खोलने में कुछ समय लग सकता है और यह उपयोगकर्ताओं के लिए विशेष रूप से अच्छा अनुभव नहीं है।आईओएसओड ड्राइव से फ़ाइल डाउनलोड करने के लिए आईओएस कैसे कहूं और प्रगति फीडबैक प्राप्त करें

मैंने ऐप्पल से आईक्लाउड प्रोग्रामिंग मार्गदर्शिका को देखा है और मुझे लगता है कि वास्तव में फ़ाइल डाउनलोड करने और कुछ प्रगति फीडबैक कैसे प्राप्त करें, दस्तावेज़ीकरण बहुत अस्पष्ट है। मुझे पता है कि मुझे NSMetadataItems के साथ कुछ करना है, लेकिन वास्तव में यह नहीं समझाया जा रहा है कि इसे कैसे प्राप्त करें और इसका उपयोग कैसे करें।

क्या कोई इसे मुझे समझा सकता है?

पीएस क्या मेरे द्वारा उच्च प्रतिनिधि वाले कोई व्यक्ति इस पोस्ट को UIDocumentPicker और iCloudDrive के साथ टैग कर सकता है?

+1

http://stackoverflow.com/a/23593943/4034301 यह उपयोगी –

उत्तर

7

मेरी जानकारी के लिए, आप केवल Ubiquitous Item Downloading Status Constants जो केवल 3 राज्यों को प्रदान करता है का उपयोग कर प्रगति प्रतिक्रिया प्राप्त कर सकते हैं:

  • NSURLUbiquitousItemDownloadingStatusCurrent
  • NSURLUbiquitousItemDownloadingStatusDownloaded
  • NSURLUbiquitousItemDownloadingStatusNotDownloaded

तो आप नहीं कर सकते एक प्रमाणित प्रगति प्रतिक्रिया है, केवल आंशिक उर्फ ​​डाउनलोड या नहीं।

ऐसा करने के लिए, आप को तैयार करने के लिए और अपनी NSMetadataQuery शुरू करते हैं, कुछ पर्यवेक्षकों जोड़ सकते हैं और NSURLUbiquitousItemDownloadingStatusKey कुंजी का उपयोग कर अपने NSMetadataItem को डाउनलोड करने की स्थिति की जांच की जरूरत है।

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]; 

फिर, एक NSMetadataQuery से

- (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

हां, अगर मैं एक विशिष्ट फ़ाइल खोजना चाहते हैं, मैं तो बस ऐसा कर सकते हैं भविष्य में इसका उपयोग करें? – Weston

+0

हाँ, आप एक विशिष्ट नाम, अपने एक्सटेंशन, पथ, आकार, निर्माण तिथि या [विशेषता कुंजी] में परिभाषित कुछ भी फाइलों के लिए देख सकते हैं (https://developer.apple.com/library/ios/documentation/Cocoa NSMetadataItem से/Reeference/Foundation/Classes/NSMetadataItem_Class/index.html#//apple_ref/doc/constant_group/Attribute_Keys)। मैंने एक उदाहरण जोड़ने के लिए अपना जवाब संपादित किया। – HiDeo

+0

एक और सवाल, आप अपडेट बंद क्यों करते हैं, फिर उन्हें वापस चालू करें? – Weston

1

प्रगति प्रतिक्रिया सूचनाओं के माध्यम से होता है। अद्यतन आवृत्ति एक बार प्रति सेकंड प्रति सेकंड है (notificationBatchingInterval सेट करके बदला जा सकता है)। NSMetadataItem के सरणी के रूप में अधिसूचना के userInfo में अद्यतन वस्तुओं को encapsulated हैं। फीडबैक डाउनलोड प्रत्येक आइटम के कुंजी NSMetadataUbiquitousItemPercentDownloadedKey में encapsultaed है। चूंकि सरणी आंतरिक रूप से परिवर्तनीय हैं, इसलिए हमें परिणामों को गिनने के दौरान अद्यतनों को अक्षम करने के लिए NSMetadataQuery बताना होगा। यह महत्वपूर्ण है, अन्यथा अजीब दुर्घटनाएं हो सकती हैं।

एक ठेठ क्रियान्वयन ऐसा दिखाई दे सकता है:

- (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]; 
} 
संबंधित मुद्दे