问题
var arrayData: [String] = []
let bodyData = "parameter=test"
let URL: NSURL = NSURL(string: "Link to php file")
let request:NSMutableURLRequest = NSMutableURLRequest(URL:URL)
request.HTTPMethod = "POST"
request.HTTPBody = bodyData.dataUsingEncoding(NSUTF8StringEncoding);
NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue())
{
(response, data, error) in
var output = NSString(data: data, encoding: NSUTF8StringEncoding)
self.arrayData = self.JSONParseArray(output)
println(self.arrayData) //Print the result
}
println(self.arrayData) //Print nothing
It look like the new value is only available in sendAsynchronousRequest
Is there a way to make the new value accessible out of the sendAsynchronousRequest ?
回答1:
sendAsynchronousRequest
is, as the name suggests, asynchronous. So your final println
runs before the request is complete. After the completion handler runs, the new data will be available for all readers (in or outside this handler).
回答2:
sendAsynchronousRequest
requires a callback passed as argument, which is executed once the asynchronous request has been completed. That's out of the linear flow in your code.
This is what happens:
- you call
sendAsynchronousRequest
- the request is started, but the function returns immediately (it doesn't wait for the request to be completed)
- the
println
line is executed next (last line in your code) - some time later, the asynchronous request is completed, and the closure is executed
- the closure assigns a value to
self.arrayData
If you want to use the updated value, you have to change the logic a little bit. You can call another closure or a class method (meaning an instance method, not a static one) to post process that variable once it has been set.
来源:https://stackoverflow.com/questions/25532097/new-value-is-only-available-in-sendasynchronousrequest-swift