2015-05-04 50 views
2

我有一个问题,以获得异步过程中的价值。swift iOS从异步获取价值(发布数据)

我的课是:

public class PostService: NSObject { 

var result : String = String() 

//this is my function 


func request(var dataPost : String, var destination : String)->String{ 

    let request = NSMutableURLRequest(URL: NSURL(string: destination as String)!) 
    request.HTTPMethod = "POST" 
    let postString = dataPost 
    request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding) 
    let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { 
     data, response, error in 

     if error != nil { 
      println("error=\(error)") 
      return 
     } 

     let responseString = NSString(data: data, encoding: NSUTF8StringEncoding) 

     self.result = responseString as String! 

    } 

    task.resume() 

//problem is here that result will fill after async 

    return self.result  
} 

} 

//我在这里

override func viewDidLoad() { 
    super.viewDidLoad() 
    var dataPost :String="Name=Ali" 
    var dest : String = "http://example.com/api/getUserName" 
    var result = Post.request(dataPost, destination: dest) 
    lbltext.text = result as String! 
} 
+3

有很多帖子完全相同的问题。您不能从异步函数返回值。异步回调必须存储结果并触发所有必需的操作。 – gnasher729

回答

6
func request(var dataPost : String, var destination : String, successHandler: (response: String) -> Void)->String{ 
    let request = NSMutableURLRequest(URL: NSURL(string: destination as String)!) 
    request.HTTPMethod = "POST" 
    let postString = dataPost 
    request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding) 
    let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { 
     data, response, error in 

     if error != nil { 
      println("error=\(error)") 
      return 
     } 

     let responseString = NSString(data: data, encoding: NSUTF8StringEncoding) 

     //self.result = responseString as String! 
     successHandler(responseString as String!); 

    } 

    task.resume() 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 
    var dataPost :String="Name=Ali" 
    var dest : String = "http://example.com/api/getUserName" 
    Post.request(dataPost, destination: dest, successHandler: { 
     (response) in 
     lbltext.text = response; 
    }); 

} 

像下面这样。基本上,您传递成功处理程序的回调函数,并在回调函数中执行您的操作。

异步操作意味着它们独立于代码的字节序列而发生。这就是为什么当你进行异步调用时,你不能返回一个值。代码的原始序列在异步调用在后台(或另一个线程)中运行时运行。这就是成功和错误处理程序存在的原因。它们允许您在异步请求完成时运行一段代码。

P.S请重新格式化您的问题,并确保所有代码都正确缩进。

0

错误的做法,使用此功能


override func viewDidLoad() { 

    var result = Post.request(dataPost, destination: dest)// This is the method requesting web data from server asynchronously 
    lbltext.text = result as String! // This is wrong, how can you expect data on the very next line , it will always be nil 

只要在func request中完成下载并调用委托方法中的数据,就可以调用委托方法并将数据传递给视图控制器类。