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

    } 
} 

Ktoś wie, jak uzyskać dane z zadania?Jak mogę uzyskać dane z NSURLSession.sharedSession(). DataTaskWithRequest

+0

Możliwy duplikat [Ładowanie/Pobieranie obrazu z adresu URL w Swift] (https://stackoverflow.com/questions/24231680/loading-downloading-image-from-url -on-swift) –

Odpowiedz

32

Nie można zwrócić danych bezpośrednio z asynchronicznego zadania.

Rozwiązanie z Swift 2 jest wykonanie obsługi ukończenia takiego:

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

ten sposób, zakończenie jest wywoływana tylko wtedy, gdy asynchroniczny zadanie jest zakończone. Jest to sposób na "zwrócenie" danych bez faktycznego korzystania z return.

Swift 3 wersja

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) ** To było szybkie dla Swift 3! ** 2) ** pochodzące z tła Objective-C, jest to nieco mylące. Nie widzisz żadnego słowa kluczowego "completionHandler" w Swift. Czy to coś wywnioskowano? – Honey

+1

Tak. Jest to standardowa składnia Swift. Jeśli zamknięcie jest zdefiniowane na końcu funkcji, zamknięcie można zdefiniować po wykluczeniu nawiasu zamykającego ") i nazwy parametru. Nazywają się one końcowymi zamknięciami. Zobacz https://developer.apple.com/library/mac/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html – user1956608

Powiązane problemy