6

मूल रूप से मैंने सोचा कि अगर NSURLSessionDownloadTask सफलतापूर्वक समाप्त हो जाता है तो URLSession:downloadTask:didFinishDownloadingToURL: विधि को कॉल किया जाएगा, अगर यह किसी कारण से विफल रहता है - URLSession:task:didCompleteWithError:। यह सिम्युलेटर पर अपेक्षित काम करता है (केवल इस विधि में से एक को एक डाउनलोड कार्य के लिए बुलाया जाता है) लेकिन डिवाइस पर यह मामला नहीं है: विफलता के मामले में इन दोनों विधियों को बुलाया जाता है, URLSession:downloadTask:didFinishDownloadingToURL: पहला वाला होता है। (ये दोनों विधियां पैरामीटर में एक ही कार्य को पास करती हैं)NSRLSessionDownloadTask विफलता को संभालना

क्या मुझे कुछ याद आ रही है?

+0

मैंने उसी व्यवहार को देखा है जिसमें DidFinishDownloadingToURL को TheCompleteWithError के साथ बुलाया जाता है। इससे हमारे लिए जबरदस्त समस्याएं आई हैं। आपने इसके आसपास कैसे काम किया है? – RunLoop

+0

उस स्थिति में स्थान शून्य हो सकता है। क्या आप इसे देख सकते हैं? – AsifHabib

उत्तर

1

उपयोग पूरा होने के प्रतिनिधि के बजाय ब्लॉक:

NSURLSessionDownloadTask *mySessionDownloadTask = [myURLSession downloadTaskWithRequest:myRequest completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) 
{ 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     if(!error) 
     { 
      // Finish loading 
     } 
     else 
     { 
       // Handle error 
     }); 
}]; 

नोट: यदि आप मुख्य कतार नहीं मिलता है, यूजर इंटरफेस से संबंधित किसी भी अद्यतन मंद जो पहले से न सोचा व्यवहार का कारण बनता है हो जाएगा।

+1

मैं अपने उपयोगकर्ताओं को पृष्ठभूमि मोड में जाने पर अपने डाउनलोड समाप्त करना चाहता हूं, इसलिए मैं एक प्रतिनिधि के बजाय पूर्णता ब्लॉक का उपयोग नहीं कर सकता (क्योंकि मैं पृष्ठभूमि सत्र का उपयोग कर रहा हूं) – dariaa

+0

मैं आपको प्राप्त करता हूं। तो यह जानने के लिए कि क्या आपने प्रतिक्रिया संसाधित की है, वैश्विक बूल का उपयोग करने के बारे में कैसे? –

+0

वैसे, निश्चित रूप से एक कामकाज हो सकता है, लेकिन मैं कुछ गहरी समझ के लिए जा रहा था। क्या यह एक अपेक्षित व्यवहार है या यह एक बग है जिसे रिपोर्ट किया जाना चाहिए, इत्यादि।बीटीडब्लू एक 'बूल' ध्वज यहां सबसे अच्छा विकल्प नहीं है, क्योंकि 'URL सत्र में: downloadTask: didFinishDownloadingToURL:' (जिसे पहले कहा जाता है) आमतौर पर फ़ाइल को आगे प्रसंस्करण के लिए दस्तावेज़ निर्देशिका में कॉपी करता है। अगर डाउनलोड सफलतापूर्वक या त्रुटि के साथ समाप्त हो गया तो उस बिंदु पर जानना अच्छा लगेगा। – dariaa

-1

NSURLSessionDownloadTaskNSURLSessionTask का उप-वर्ग है, जिसमें error संपत्ति है। क्या आप अपनी फ़ाइल की प्रतिलिपि बनाने का प्रयास करने से पहले अपने URLSession:downloadTask:didFinishDownloadingToURL: प्रतिनिधि विधि में जांच सकते हैं?

+0

त्रुटि संपत्ति तब तक शून्य बनी हुई है जब तक यह क्लाइंट-साइड त्रुटि न हो। –

1

NSURLSessionDownloadDelegate के तहत ऐप्पल के दस्तावेज़ीकरण के अनुसार यह मानक व्यवहार है।

प्रतिक्रिया हेडर में स्थिति कोड प्राप्त करने के लिए, आपको पहले एक NSURLSessionDataTask शुरू करनी चाहिए:

/* Sent when a download task that has completed a download. The delegate should 
* copy or move the file at the given location to a new location as it will be 
* removed when the delegate message returns. URLSession:task:didCompleteWithError: 
* will still be called. */ 
0

मैं इस समस्या का समाधान मिल गया।

यह निम्नलिखित प्रतिनिधि विधि URL सत्र को कॉल करेगा: डेटाटास्क: didReceiveResponse: completHandler:

इस विधि में, आप पहली बार NSURLResponse मापदंडों का स्थिति कोड (एक NSHTTPURLResponse करने के लिए इसे कास्टिंग द्वारा) की जांच कर सकते हैं और अंत में या तो NSURLSessionResponseBecomeDownload साथ पूरा होने हैंडलर फोन (जो के रूप व्यवहार करेंगे एक downloadTask करने के लिए अपने dataTask कन्वर्ट करने के लिए आप किसी NSURLSessionDownloadTask से अपेक्षा करेंगे) या NSURLSessionResponseCancel कुछ डेटा डाउनलोड करने से बचने के लिए (उदाहरण के लिए यदि प्रतिक्रिया का स्थिति कोड 404 है)।

इसके अलावा, आप परिवर्तित NSURLSessionDownloadTask साथ कुछ करने के लिए है, यह URLSession में किया जा सकता (एक सरणी या एक शब्दकोश में भंडारण या नई वस्तु के साथ डेटा कार्य की जगह की तरह) की जरूरत है: dataTask: didBecomeDownloadTask:

उम्मीद है कि यह किसी की मदद करेगा!

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