2016-11-17 8 views
5

यह वही है एप्पल प्रलेखन NSURLSessionTask वर्गNSURLSessionTask। को निलंबित

एक टास्क के suspend विधि के बारे में कहते हैं काम नहीं करता, पर निलंबित कर दिया है, कोई नेटवर्क यातायात पैदा करता है और समय समाप्ति के अधीन नहीं है।

ठीक है। तो मैं निम्नलिखित सरल कोड चल रहा हूँ:

 let url = NSURL(string: "http://httpbin.org/delay/10")! 
     let urlRequest = NSURLRequest(URL: url) 

     self.task = NSURLSession.sharedSession().dataTaskWithURL(urlRequest.URL!, completionHandler: { 

      data, response, error in print("completion ERROR \(error)") 
     }) 

     self.task.resume() 

     print("Start") 
     delay(5, closure: { 

      self.task.suspend() 

      print("Suspend") 
     }) 

समारोह delay बस dispatch_after के चारों ओर एक आवरण है और http://httpbin.org/delay/10 के लिए एक अनुरोध 10 सेकंड के बाद प्रतिक्रिया देता है। प्रतिक्रिया के इंतजार के बीच में मैंने कार्य को निलंबित कर दिया। हालांकि यह काम नहीं करता है। 60 सेकंड में समापन ब्लॉक को टाइमआउट त्रुटि के साथ बुलाया जाता है। क्या कोई बता सकता है कि क्या गलत है?

+0

आप 'dispatch_after' आसपास आवरण दिखा सकते हैं URLSessionDataTask

 let dataTask = URLSession.shared.dataTask(with: request) { (data, urlResponse, error) in print("response is received all the time") } } dataTask.resume() dataTask.suspend() 

पर कोई प्रभाव नहीं? –

उत्तर

5

यह सामान्य व्यवहार प्रतीत होता है, हालांकि ऐप्पल से अधिक निश्चित दस्तावेज हम जो देख रहे हैं उसे स्पष्ट करने में उपयोगी होंगे।

ऐप्पल का प्रलेखन कैसे निलंबित काम करता है, या जब इसका उपयोग किया जाना चाहिए, इसकी एक विस्तृत व्याख्या प्रदान नहीं करता है। हालांकि, मेरा विचार (परीक्षण और शोध के आधार पर) यह है कि suspend() केवल कार्यों को डाउनलोड करने के लिए उपयोग किया जाना चाहिए। डेटा कार्यों को केवल resume() (कार्य शुरू करने के लिए) और उपयुक्त होने पर cancel() का उपयोग करना चाहिए।

एक्सकोड और चार्ल्स प्रॉक्सी का उपयोग करके मेरा परीक्षण, पता चला कि एक निलंबित डेटा कार्य का नेटवर्क ट्रैफ़िक पर कोई प्रभाव नहीं पड़ता है जैसा कि ऐप्पल के दस्तावेज़ में दर्शाया गया है। दूसरे शब्दों में, नेटवर्क यातायात का उत्पादन होता है। यह कहा जाता है, तो सही फिर से शुरू करने के बाद, यह डेटा काम पर कोई प्रभाव नहीं है

1):

मैं दो बातों को निरस्त करने और डेटा कार्यों का उपयोग कर मनाया। यह नेटवर्क यातायात को निलंबित नहीं करता है और नेटवर्क या सर्वर साइड-साइड मुद्दों को छोड़कर, कॉलबैक में एक सफल प्रतिक्रिया प्राप्त होती है।

2) अगर इसे dispatch.asyncAfter कॉलबैक में बुलाया जाता है, तो यह अभी भी नेटवर्क यातायात को निलंबित नहीं करता है, हालांकि कॉलबैक को सफल प्रतिक्रिया के बजाय "अनुरोध टाइमआउट" त्रुटि मिलती है। चार्ल्स प्रॉक्सी के अनुसार, अनुरोध सफल है हालांकि। यह परिणाम है जो मुझे विश्वास दिलाता है कि suspend() डेटा कार्यों के साथ उपयोग नहीं किया जाना चाहिए। इस कॉलबैक का परिणाम अनिवार्य रूप से मेरी राय में बेकार है।

एक डेटा कार्य रद्द कर रहा है:

cancel() काम करता है के रूप में उम्मीद। क्लाइंट (आप) सर्वर से पूर्ण प्रतिक्रिया प्राप्त करने से पहले कनेक्शन बंद कर देता है। यह resume() पर कॉल करने के बाद या बाद में (अनुरोध पूरा होने से पहले) सही करने के बाद किया जा सकता है।

+0

"अनुरोध का समय समाप्त हो गया।" वो क्या है? त्रुटि पूर्णता ब्लॉक में पारित किया? तो यह आपके लिए सिर्फ मेरे लिए काम करता है, इसलिए निलंबित कार्य के लिए यह सामान्य व्यवहार है, है ना? यदि हां, तो हमें निलंबन की आवश्यकता क्यों है? या मैंने कुछ गलत समझा? –

+0

@Andrey चेर्नुखा क्षमा करें, ऐसा लगता है कि मैंने आपके प्रश्न का गलत व्याख्या किया। मैंने सोचा कि आप कंसोल में "सस्पेंड" संदेश नहीं देख रहे थे। –

+0

@Andrey चेर्नुखा आप सही हैं, मैंने अधिक जानकारी प्रदान करने के लिए अपना उत्तर अपडेट किया है। यह डेटा कार्य के लिए सामान्य व्यवहार प्रतीत होता है। एक कार्य कार्य संभावित रूप से पूरा होने तक पूरा नहीं हो जाता है जब तक कि कार्य शुरू नहीं हो जाता है और पूरा हो जाता है। –

0

मुझे लगता है कि निलंबित (स्वीकार) लेकिन जब मैं रद्द करने का प्रयास यह है

let dataTask = URLSession.shared.dataTask(with: request) { (data, urlResponse, error) in       
        print("response is cancelled") 
        } 
       } 
       dataTask.resume() 
       dataTask.cancel() 
संबंधित मुद्दे