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 

    } 
} 

Qualcuno sa come ottenere i dati dall'attività?Come posso ottenere i dati da NSURLSession.sharedSession(). DataTaskWithRequest

+0

Possibile duplicato [Caricamento/Download immagine da URL su Swift] (https://stackoverflow.com/questions/24231680/loading-downloading-image-from-url -on-swift) –

risposta

32

Non è possibile restituire dati direttamente da un'attività asincrona.

La soluzione con Swift 2 è di fare un gestore completamento simili:

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

In questo modo, il completamento viene chiamato solo quando l'operazione asincrona viene completata. È un modo per "restituire" i dati senza effettivamente utilizzare return.

Swift 3 versione

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) ** Questo è stato veloce per Swift 3! ** 2) ** proveniente da uno sfondo Objective-C, è un po 'confuso. Non vedi alcuna parola chiave 'completionHandler' in Swift. È qualcosa che ha dedotto? – Honey

+1

Sì. È la sintassi Swift standard. Se una chiusura è definita alla fine di una funzione, la chiusura può essere definita dopo la parentesi chiusa ')' e il nome del parametro escluso. Si chiamano chiusure finali. Vedi https://developer.apple.com/library/mac/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html – user1956608