2016-12-01 17 views
9

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

मैं Alamofire उपयोग कर रहा हूँ और मैं सत्र प्रबंधक सेट:

let backgroundManager: Alamofire.SessionManager = { 
    let bundleIdentifier = "com....." 
    return Alamofire.SessionManager(
     configuration: URLSessionConfiguration.background(withIdentifier: bundleIdentifier + ".background") 
    ) 
    }() 

तो मैं इस तरह यह उपयोग कर रहा हूँ:

self.backgroundManager.download(fileUrl, to: destination) 
    .downloadProgress { progress in 
     //print("Download Progress: \(progress.fractionCompleted)") 
    } 
    .response(completionHandler: result) 

यह downloadPhoto विधि में है और मैं यह बोल रहा हूँ:

for item in items { 
     self.downloadPhoto(item: item, isThumbnail: true, shouldReloadData: false, indexPath: nil) 
     self.downloadPhoto(item: item, isThumbnail: false, shouldReloadData: false, indexPath: nil) 
} 

फिर मैं फ़ाइल डाउनलोड और वीडियो डाउनलोड और अन्य के लिए कॉल जोड़ सकता था। लेकिन इन सभी अनुरोधों की प्राथमिकता समान है और मैं पहले थंबनेल डाउनलोड करना चाहता हूं (क्योंकि यह वही है जो उपयोगकर्ता पहले देखते हैं) फिर पूर्ण आकार की छवियां और सभी छवियों को डाउनलोड करने के बाद फ़ाइलें और वीडियो डाउनलोड किए जाते हैं। लेकिन सभी कतार में होना चाहिए क्योंकि यदि उपयोगकर्ता ऐप शुरू करता है और फिर इसे पृष्ठभूमि में सेट करता है और इसे कई घंटों तक छोड़ देता है तो सभी को डाउनलोड किया जाना चाहिए। क्या यह संभव है? और मैं यह कैसे कर सकता हूँ?

मैं अलामोफ़ीयर को देख रहा था कि इसमें घटक लाइब्रेरी अलामोफिर इमेज है जिसकी प्राथमिकता आधारित डाउनलोड है लेकिन छवियां केवल उन फ़ाइलों का हिस्सा हैं जिन्हें मैं प्राथमिकता देना चाहता हूं। मदद के लिए धन्यवाद

+0

सिर्फ एक टिप्पणी है: एक उपयोगकर्ता के रूप में मैं नहीं करना चाहते हैं कि पृष्ठभूमि उपयोग में एप्लिकेशन को सभी चीज़ों को डाउनलोड करने के लिए सब मे सेलफोन डेटा योजना। क्या आपने इस डाउनलोड के बारे में उपयोगकर्ता को सूचित करने की योजना बनाई है? या केवल वाईफाई मोड में? – muescha

उत्तर

2

TWRDDownloadManager पर एक नज़र डालें। यह NSURLSessionDownloadTask का उपयोग करता है और पृष्ठभूमि मोड का भी समर्थन करता है।

आपको क्या करने की जरूरत है:

1. सेट HTTPMaximumConnectionsPerHost 1 करने के लिए सुनिश्चित करें कि डाउनलोड क्रमानुसार होने होने के लिए:

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; 
configuration.timeoutIntervalForRequest = 30.0; 
configuration.HTTPMaximumConnectionsPerHost = 1; // Note this 

2. के बाद विधि के लिए पुनरावृति है लूप और मीडिया को एक-एक करके डाउनलोड करें:

-(void)downloadDocuments 
{ 
    for(int i=0; i<[arrDownloadList count]; i++) 
    { 
     Downloads *download = [arrDownloadList objectAtIndex:i]; 
     NSString *fileURL = download.documentURL; 

     [[TWRDownloadManager sharedManager] downloadFileForURL:fileURL 
                 withName:[fileURL lastPathComponent] 
               inDirectoryNamed:kPATH_DOC_DIR_CACHE_DOCUMENTS 
               completionBlock:^(BOOL completed) 
     { 
      if (completed) 
      { 
       /* To some task like database download flag updation or whatever you wanr */ 

       downloadIndex++; 

       if(downloadIndex < [arrDownloadList count]) { 
        [self updateDownloadingStatus]; 
       } 
       else { 
        [self allDownloadCompletedWithStatus:TRUE]; 
       } 
      } 

      else 
      { 
       /* Cancel the download */ 
       [[TWRDownloadManager sharedManager] cancelDownloadForUrl:fileURL]; 

       downloadIndex++; 

       if(downloadIndex < [arrDownloadList count]) { 
        [self updateDownloadingStatus]; 
       } 
       else { 
        [self allDownloadCompletedWithStatus:TRUE]; 
       } 
      } 

     } enableBackgroundMode:YES]; 
    } 
} 

पृष्ठभूमि मोड सक्षम करने के लिए मत भूलना:

enter image description here

4. अपने AppDelegate के लिए निम्न विधि जोड़ें:: enableBackgroundMode:YES

3. Xcode में Background Modes सक्षम

- (void)application:(UIApplication *)application handleEventsForBackgroundURLSession:(NSString *)identifier completionHandler:(void (^)())completionHandler{ 
    [TWRDownloadManager sharedManager].backgroundTransferCompletionHandler = completionHandler; 
} 

यदि आप ऐसा करते हैं, तो डाउनलोडिंग क्रमशः घटित होगी और यह तब भी जारी रहेगी जब ऐप पृष्ठभूमि में है या उपयोगकर्ता डिवाइस को लॉक करता है।

कृपया किसी भी प्रश्न या इसके बारे में सहायता के मामले में टिप्पणी जोड़ें।

2

मेरा मानना ​​है कि आईओएस मानक URLSessionDownloadTask आपकी मदद करेगा।इसमें संपत्ति priority है, जो आपको दिखने की तरह दिखती है।

यहाँ आधिकारिक है documentation

यहाँ कुछ tutorial

संबंधित मुद्दे