2015-07-07 7 views
18
class PostFOrData { 
    let url = NSURL(string: "http://210.61.209.194:8088/SmarttvWebServiceTopmsoApi/GetReadlist") 
    var picUrl = NSURL(string : "http://210.61.209.194:8088/SmarttvMedia/img/epi00001.png") 
    var responseString : NSString = "" 

    func forData() -> NSString { 

     let request = NSMutableURLRequest(URL: url!) 
     request.HTTPMethod = "POST" 
     var s : NSString = "" 

     let postString : String = "uid=59" 
     request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding) 

     let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { 
      data, response, error in 

      if error != nil { 
       println("error=\(error)") 
       return 
      } else { 
       println("response = \(response!)") 
       self.responseString = NSString(data: data, encoding: NSUTF8StringEncoding)! 
       println("responseString = \(self.responseString)") 
      } 

     } 

     // I want to return NSString here, but I always get nothing 

     return self.responseString 

    } 
} 

कोई भी जानता है कि कार्य से डेटा कैसे प्राप्त किया जाए?मैं NSURLSession.sharedSession() से डेटा कैसे प्राप्त कर सकता हूं। डेटाटास्कविथरक्वेट

+0

संभावित डुप्लिकेट [लोड हो रहा है/स्विफ्ट पर URL से छवि डाउनलोड कर] (https://stackoverflow.com/questions/24231680/loading-downloading-image-from-url -ऑन-स्विफ्ट) –

उत्तर

32

आप डेटा को सीधे एसिंक्रोनस कार्य से वापस नहीं कर सकते हैं।

class PostFOrData { 
    // the completion closure signature is (NSString) ->() 
    func forData(completion: (NSString) ->()) { 
     if let url = NSURL(string: "http://210.61.209.194:8088/SmarttvWebServiceTopmsoApi/GetReadlist") { 
      let request = NSMutableURLRequest(URL: url) 
      request.HTTPMethod = "POST" 
      let postString : String = "uid=59" 
      request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding) 
      let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { 
       data, response, error in 
       if let data = data, 
        jsonString = NSString(data: data, encoding: NSUTF8StringEncoding) 
        where error == nil { 
         completion(jsonString) 
       } else { 
        print("error=\(error!.localizedDescription)") 
       } 
      } 
      task.resume() 
     } 
    } 
} 


let pfd = PostFOrData() 

// you call the method with a trailing closure 
pfd.forData { jsonString in 
    // and here you get the "returned" value from the asynchronous task 
    print(jsonString) 
} 

इस तरह, पूरा होने पर ही अतुल्यकालिक कार्य पूरा हो गया है कहा जाता है:

स्विफ्ट 2 के साथ समाधान इस तरह एक पूरा होने हैंडलर बनाने के लिए है। यह return का उपयोग किए बिना डेटा को "वापस" करने का एक तरीका है।

स्विफ्ट 3 संस्करण

class PostFOrData { 
    // the completion closure signature is (String) ->() 
    func forData(completion: @escaping (String) ->()) { 
     if let url = URL(string: "http://210.61.209.194:8088/SmarttvWebServiceTopmsoApi/GetReadlist") { 
      var request = URLRequest(url: url) 
      request.httpMethod = "POST" 
      let postString : String = "uid=59" 
      request.httpBody = postString.data(using: String.Encoding.utf8) 
      let task = URLSession.shared.dataTask(with: request) { 
       data, response, error in 
       if let data = data, let jsonString = String(data: data, encoding: String.Encoding.utf8), error == nil { 
        completion(jsonString) 
       } else { 
        print("error=\(error!.localizedDescription)") 
       } 
      } 
      task.resume() 
     } 
    } 
} 


let pfd = PostFOrData() 

// you call the method with a trailing closure 
pfd.forData { jsonString in 
    // and here you get the "returned" value from the asynchronous task 
    print(jsonString) 
} 
की
+0

** 1) ** यह स्विफ्ट 3 के लिए जल्दी था! ** 2) ** एक उद्देश्य-सी पृष्ठभूमि से आ रहा है, यह थोड़ा उलझन में है। आपको स्विफ्ट में कोई 'पूरा करने वाला हैडलर' कीवर्ड नहीं दिख रहा है। क्या वह कुछ अनुमानित है? – Honey

+1

हां। यह मानक स्विफ्ट वाक्यविन्यास है। यदि किसी फ़ंक्शन के अंत में एक क्लोजर परिभाषित किया गया है तो क्लोजिंग को '' 'ब्रैकेट के बाद परिभाषित किया जा सकता है और पैरामीटर नाम को बाहर रखा गया है। उन्हें पिछला बंद कहा जाता है। Https://developer.apple.com/library/mac/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html देखें – user1956608

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