2015-07-07 6 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 

    } 
} 

Veriler görevden nasıl alınacağını biliyor mu?Verileri nasıl alabilirim NSURLSession.sharedSession(). DataTaskWithRequest

+0

Olası kopyalar [Yükleme/Swift üzerinde URL'den resim indiriliyor] (https://stackoverflow.com/questions/24231680/loading-downloading-image-from-url -on hızlı) –

cevap

32

Verileri eşzamansız bir görevden doğrudan geri dönemezsiniz. asenkron görev tamamlandığında

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) 
} 

Bu şekilde, tamamlama sadece denir:

Swift 2 ile çözüm böyle bir tamamlama işleyicisi yapmaktır. Gerçekte return'u kullanmadan verileri "geri döndürmenin" bir yoludur.

Swift 3 versiyonu

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) 
} 
ait
+0

** 1) ** Swift 3 için hızlıydı! ** 2) ** Bir Objective-C arka planından geliyor, biraz kafa karıştırıcı. Swift'de "completionHandler" anahtar kelimesini görmüyorsunuz. Bu bir şey mi var? – Honey

+1

Evet. Standart Swift sözdizimi. Bir fonksiyonun sonunda bir kapanma tanımlanmışsa, kapanma ')' braketinden ve parametre adı hariç tutulduktan sonra tanımlanabilir. Sondaki kapanışları aradılar. Https://developer.apple.com/library/mac/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html sayfasına bakın. – user1956608