2012-06-20 17 views
6

मुझे फ़ाइलों को डाउनलोड करने की आवश्यकता है> 500 एमए AFNetworking के साथ। कभी-कभी, उन्हें डाउनलोड करने का समय> 10 मिनट और यदि ऐप पृष्ठभूमि में है, तो डाउनलोड पूर्ण नहीं हो सकता है।AFNetworking + बड़ी डाउनलोड फ़ाइलें + डाउनलोड फिर से शुरू करें

तो मैं आंशिक डाउनलोड आज़माएं। मुझे बहुत सारे लिंक मिले और यह AFHTTPRequestOperation पर रोकें() और फिर से शुरू() विधियों के साथ संभव प्रतीत होता है।

वास्तव में, मैंने किया था:

[self.downloadOperation setShouldExecuteAsBackgroundTaskWithExpirationHandler:^{ 
    // Clean up anything that needs to be handled if the request times out 
    [self.downloadOperation pauseDownload]; 
    }]; 

DownloadOperation AFHTTPRequestOperation (सिंगलटन) के एक उपवर्ग है।

और AppDelegate में:

- (void)applicationWillEnterForeground:(UIApplication *)application 
{ 
    // resume will only resume if it's paused... 
    [[DownloadHTTPRequestOperation sharedOperation] resumeDownload]; 
} 

सर्वर हेडर में नई रेंज पाने के लिए ठीक है ...

मेरे सवालों का: ऐसा करने के लिए अच्छा तरीका

1) है-टी यह 2) क्या फिर से शुरू करने के लिए आउटपुटस्ट्रीम को बदलने की आवश्यकता है (संलग्न करें: NO => संलग्न करें: हाँ)? या यह एएफनेटवर्किंग द्वारा कहीं प्रबंधित किया गया है? (नहीं मिल रहा है)

self.outputStream = [NSOutputStream outputStreamToFileAtPath:self.filePath append:YES]; 

कुछ इस तरह (DownloadHTTPRequestOperation में):

- (void)pauseDownload 
{ 
    NSLog(@"pause download"); 
    [self pause]; 
} 

- (void)resumeDownload 
{ 
    NSLog(@"resume download"); 
    self.outputStream = [NSOutputStream outputStreamToFileAtPath:self.filePath append:YES]; 
    [self resume]; 
} 

आपकी मदद के लिए धन्यवाद।

उत्तर

1

मैं इसी तरह के कार्य के लिए पुराने (गैर एआरसी) ASIHTTPRequest ढांचे का उपयोग कर समाप्त हुआ। AllowResumeForFileDownloads आपको जो चाहिए वह करता है। ध्यान दें कि आपको रेंज http शीर्षलेख पढ़कर सर्वर को फिर से शुरू करने की आवश्यकता है।

if (![[NSFileManager defaultManager] fileExistsAtPath:downloadPath]){ 
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
    [request setDelegate:self]; 
    [request setAllowResumeForFileDownloads:YES]; 
    [request setDownloadDestinationPath:downloadPath]; 
    [request setTemporaryFileDownloadPath:tmpPath]; 
    [request startAsynchronous]; 
} 
+0

BTW AFNetworking भी है "गैर एआरसी" – pahan

+1

AFNetworking एआरसी अब सक्षम है। – tangqiaoboy

6

अद्यतन:

steipete अभ्यस्त AFDownloadRequestOperation किसी भी अधिक (https://github.com/steipete/AFDownloadRequestOperation/pull/68) को बनाए रखने हो सकता है। NSURLSessionDownloadTask एक बेहतर विकल्प हो सकता है।


https://github.com/steipete/AFDownloadRequestOperation

इसके अलावा, मैं AFDownloadRequestOperation पर एक lib आधार लिखें: https://github.com/BB9z/RFDownloadManager

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