我已经开始学习ios开发了一段时间,我已经到达了我试图从服务器发送和接收数据的部分。 我遇到了一个问题,例如,如果我想使用异步连接在用户中签名或注册。使用swiftyjson的datamanager类的代码示例:
class func signUp() -> NSString {
var url: NSURL = NSURL(string: "http://localhost/Test/signup.php")!
var request:NSMutableURLRequest = NSMutableURLRequest(URL:url)
var bodyData = "username=Datforis&name=firas&password=123123"
request.HTTPMethod = "POST"
request.HTTPBody = bodyData.dataUsingEncoding(NSUTF8StringEncoding);
var status = "error"
NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue())
{
(response, data, error) in
println(response)
if(error != nil){
//handleerror
}
else if data == nil {
println("Server could not be reached please check your internet connection")
status = "connectionerror"
}
else {
println("i'm here")
let json = JSON(data : data)
var msgint : Int = json["status"].int!
status = String(msgint)
println(status)
}
}
println(status + " is current" )
return status //returns status if sign up was successful or not
}
代码将始终返回"错误" (默认值)因为在修改状态字符串之前正在执行return语句。 如果我重复相同的代码但使用同步连接它可以正常工作,但我问的每个人都告诉我要避开同步连接,因为它们会在执行时冻结UI 有没有办法处理这个,而不必使用同步连接?或者这是唯一的方法?是否有更好的方法来处理注册/登录请求或一般的任何请求? 感谢
答案 0 :(得分:1)
我建议你看一下关于完成处理程序的this文章。
使用完成处理程序而不是返回语句 完成处理程序将在语句完成时调用,而不是在函数结束时调用。
我之前提到的链接有以下示例
func hardProcessingWithString(input: String, completion: (result: String) -> Void) {
…
completion(“we finished!”)
}
这可以用于数学计算,这需要很长时间,或者在您的情况下,URL请求。要检索您可以使用的数据
hardProcessingWithString(“commands”) {
(result: String) in
println(“got back: (result)“)
}
答案 1 :(得分:0)
感谢所选答案我更正了我的代码
放在Datamanager中:
DataManager.signUp("asdasd", completion: {
(status) in
println(status)
})
尝试运行函数时置于View Controller中
.SingleOrDefault()