2014-07-09 3 views
22

मैं एक अत्याधुनिक एपीआई की कोशिश कर रहा हूं जो कुछ जेसन डेटा देता है। मैं उस कोड को समाहित करना चाहता हूं जो HTTP अनुरोध बनाता है और हेडर को अपनी विधि में सेट करता है, इसलिए मैं इसे एक यूआरएल स्ट्रिंग दर्ज करके कॉल कर सकता हूं और उसके बाद विधि एक JSON ऑब्जेक्ट लौटा सकती है।स्विफ्ट में वापसी के साथ पूरा करने का उपयोग कैसे करें?

कोड के निम्न स्निपेट में, मैंने पहले से ही ऑब्जेक्ट बनाया है और हेडर सेट कर दिया है, और मैं उस चर "req" को कॉल करता हूं। मैंने डेटा, प्रतिक्रिया, या त्रुटि नाम की कोई वस्तु नहीं घोषित की है। मेरे पास निम्न कोड है जो एक JSON ऑब्जेक्ट

let sesh = NSURLSession.sharedSession() 
    let dataTask = sesh.dataTaskWithRequest(req, completionHandler: {(data, response, error) in 
     var jsonError : NSError? 
     let jsonBlob = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableLeaves, error: &jsonError) 
     println(jsonBlob) 
     }); 

    dataTask.resume() 

सही ढंग से प्रिंट करता है तो मेरा प्रश्न है। मैं इसे कैसे बना सकता हूं ताकि यह पूरा हो सकेडलर ब्लॉक jsonBlob को वापस करने में सक्षम है, जो "AnyObject!" प्रकार का है?

let sesh = NSURLSession.sharedSession() 
    let dataTask = sesh.dataTaskWithRequest(req, completionHandler: {(data, response, error) -> AnyObject! in 
     var jsonError : NSError? 
     let jsonBlob : AnyObject! = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableLeaves, error: &jsonError) 
     return jsonBlob 
     }); 

    dataTask.resume() 

तो कार्यक्रम dataTaskWithRequest करने के लिए कॉल के रूप में संकलित नहीं करेंगे:: यदि मैं निम्नलिखित होने के लिए थोड़ा कोड को संशोधित

Could not find an overload for 'dataTaskWithRequest' that accepts the supplied arguments 

मुझे यह समझ नहीं है: completionHandler कह एक संकलक चेतावनी देता है । मैं वापस आ रहा बंद के लिए सही सिंटैक्स का उपयोग कर रहा है, के रूप स्विफ्ट दस्तावेज़ का यह पेज में दी गई है:

https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html

+0

आप डेटा वापस क्यों करना चाहते हैं? यह कहां वापस आना चाहिए?यह स्पष्ट नहीं है कि आप क्या करने की कोशिश कर रहे हैं - पूरा करने वाले हैंडलर ब्लॉक को शायद कुछ भी वापस नहीं करना चाहिए। – jtbandes

+0

क्या आप कॉलर को कुछ भी वापस भेजना चाहते हैं? आपका पूरा करने वाला हैंडलर यहां प्रक्रिया को समाप्त करता है। – holex

+0

@jtbandes मुझे सिक्काबेस के एपीआई का उपयोग करके एक जीईटी अनुरोध करने की आवश्यकता है, और उसके बाद जेएसओएन ऑब्जेक्ट से डेटा निकालने की आवश्यकता है। अभी, पूरा होने वाला ब्लॉक चलाता है और जेएसओएन देता है, लेकिन ब्लॉक समाप्त होने के बाद प्रतिक्रिया डेटा खो जाता है। मुझे JSON प्रतिक्रिया ऑब्जेक्ट से कुछ डेटा का उपयोग करके एक स्ट्रिंग ऑब्जेक्ट बनाने की आवश्यकता है और यह ब्लॉक के जीवन से परे बनी हुई है। यूआरएल सत्र दस्तावेज़ों से मुझे लगता है कि मुझे कुछ NSURLSessionDataDelegate प्रोटोकॉल को लागू करना होगा जो प्रतिक्रिया लौटने के बाद आग लगती हैं। क्या ये सही है? हालांकि मैं चीजों को वापस करने के लिए बस एक साधारण समापन ब्लॉक का उपयोग करना चाहता हूं। – almel

उत्तर

33
func getSomething(callback: (Array<AnyObject>) ->()) { 
    var dataTask = NSURLSessionDataTask() 
    dataTask = session.dataTaskWithRequest(request) { (data, response, error) in 
     if (error == nil) { 
      var callbackArray = Array<MyObject>() 
      let responseDict = NSJSONSerialization.JSONObjectWithData(data, options: .MutableContainers, error: nil) as NSDictionary 
      let response = responseDict.objectForKey("response_key") as NSDictionary 
      let array = response.objectForKey("array_key") as NSArray 

      for item: AnyObject in array { 
       var arrayItem = MyObject(dict: item as NSDictionary) 
       callbackArray.append(arrayItem) 
      } 

      callback(callbackArray) 
     } else { 
      // handle an error 
     } 
    } 
    dataTask.resume() 
} 

तो फिर तुम कुछ कर सकते हैं की तरह:

getSomething() { (response) in 
    if let responseArray = response as? Array<MyObject> { 
     self.somethings = responseArray 
    } 
} 
+0

मुझे उलझन में है कि आप 'getSomething' को 'अनुरोध' नहीं दे रहे हैं अन्यथा इस फ़ंक्शन में हमेशा 'अनुरोध' होगा क्योंकि यह इसे पैरामीटर के रूप में नहीं ले रहा है ... क्या आप यह भी समझा सकते हैं कि समस्या क्या है , संभावित रूप से कुछ टिप्पणियां – Honey

+0

@ कॉलबैक के साथ हनी जोड़ें, आप सेवा से वापस आने वाली प्रतिक्रिया में वास्तव में रुचि रखते हैं। यदि आप किसी भी कारण से अनुरोध चाहते हैं तो अनुरोध ऑब्जेक्ट वापस करें। – fuzz

2

पूरा होने हैंडलर कुछ भी वापस नहीं कर सकते हैं क्योंकि बंद आपूर्ति करने के लिए है की हो गया है वापसी प्रकार शून्य और कोई भी ऑब्जेक्ट नहीं!

func dataTaskWithRequest(_ request: NSURLRequest!, 
    completionHandler completionHandler: ((NSData!, 
           NSURLResponse!, 
           NSError!) -> Void)!) -> NSURLSessionDataTask! 
4

आप here देखते हैं, dataTaskWithRequest:completionHandler: कोई उम्मीद वापसी मान वाला पूरा होने हैंडलर है।

completion handler's interface

NSURLSession उदाहरण मतलब यह है कि किसी भी मूल्य आप इस विधि बुला के बाद आगे बढ़ने के लिए से उम्मीद नहीं है, दूसरे शब्दों के साथ: आप समापन बंद (या ब्लॉक, यदि आप चाहें) प्रक्रिया को समाप्त करता है।

स्पष्ट नहीं है कि आप समापन हैंडलर के माध्यम से कॉलर को कुछ भी वापस क्यों भेजना चाहते हैं।

0

मैं जब सामग्री पर CloudKit से खींच रहा था आधारित एक केंद्रीय डीबी में जानकारी अद्यतन करने के लिए कोशिश कर रहा है एक ऐसी ही समस्या का सामना करते आए थे। सीके डेटा खींचने के लिए पैटर्न में इन एसिंक्रोनस समापन हैंडलर हैं जो कोई रिटर्न वैल्यू नहीं देते हैं।

चूंकि मैं अलग-अलग संदर्भों में समान कोड का पुन: उपयोग करने में सक्षम होना चाहता था, इसलिए मैंने सीके को अपनी कक्षा में कॉल कर दिया और एक प्रतिनिधि प्रोटोकॉल को परिभाषित किया जिसे मैंने कोर क्लास के अनुरूप बनाया था। पूरा करने वाले हैंडलर के भीतर मैंने सीके कॉल से पुनर्प्राप्त डेटा भेजा जहां मैं उन्हें प्रतिनिधि विधियों के माध्यम से संग्रहीत करना चाहता हूं।

आसान peasy।

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