目的:
在用户界面的“文本”字段中键入数字。按“开始!”按钮(用户界面)和:
1.文本字段中的数字作为发布变量(通过NSURLSession..dataTaskWithRequest)传递到PHP脚本中。
2.PHP脚本使用该变量作为对MySQL的查询的一部分。
3.查询结果返回到iOS App
4.查询结果显示在文本视图(用户界面)中
设定:
在ViewController类内部,我编写了一个额外的函数“ mysqlget(MyNum:Int)”,该函数将数字转换为NSMutableURLRequest的HTTPBody。函数继续设置NSURLSession,设置dataTaskwithRequestTask和“恢复”,即启动任务。
我的“去!”带有用于touchupinside的@IBActon设置的按钮(也位于ViewController类中)具有以下代码:
1.检查文本字段中输入的字符串是否为字符串
2.如果文本字段不是数字,则会弹出警告
3.调用mysqlget函数,传入文本字段编号。
4.将Textview.text(不是文本字段)更改为包含dataTaskWithRequest任务中的数据的变量。
问题:
dataTaskWithRequest内部的数据变量的范围受到限制
到dataTaskwithRequest主体内部。即使在mysqlget里面
函数,就在myDataTask.resume()之后,该变量不再
存在。所以很明显,我无法将变量传递回我的@IBAction
走!按钮。
解决方案失败:
在我的datataskwithrequest上放置一个“-> NSString”而不是void(该块应该在调用处理程序的结尾处终止)
将mysqlget设置为返回NSString并让mysqlget的最后一行包括“ return data_frominside_datataskwithrequest”-数据无法在请求之外生存
尝试从dataTaskWithRequest块内部更新Textview.text-即使在顶部声明了textview的@IBOutlet,当我尝试执行“ textview.text = data”时,xcode提示-必须使用“ self”。提示它看不到@IBOutlet?使用self.textview.text允许程序运行,但是一旦到达该行就会崩溃。
(我知道这通常是不好的)在ViewController之外声明一个全局变量,并使globalvariable = data。变量以某种方式保持空白。
我已经测试了代码,所有部分的工作都可以在myDataTask中获取所需的数据。我唯一不能做的就是将数据传输到myDataTask之外
原理图:
var attemptedGlobalVar: String = ""
class ViewController {
@IBOutlet myNum
@IBOutlet TextField
@IBAction GoClicked {
.
.
[code to validate myNum]
.
.
mysqlget(Int(myNum.text))
Textfield.text = data_I_need //nothing returns here
[This is where I want to process my "data_I_need"]
}
override func viewDidLoad {
[default stuff]
}
override func didReceiveMemoryWarning {
[default stuff]
}
func mysqlget(aNum: Int) {
[Setup NSURL]
[Setup POST string]
[Setup NSMutableURLRequest (HTTPMethod, HTTPBody)]
let myDataTask = NSURLSessions.sharedSession().dataTaskWithRequest (myRequest, completion handler: {(requestData, requestResponse, requestError) -> Void in
data_I_need = (NSString(data: requestData, encoding: NSUTF8StringEncoding))!
[data_I_need exists here]
[setting TextField.text = data_I_need xcode warns I need to use self.TextField.text]
}
myGetTask.resume()
[data_I_need is blank here]
}
}
简洁的问题:
我如何从@IBAction GoClicked的myGetTask块中获取data_I_need?
很抱歉问题的长度。我只想提供完整的上下文。如果您还有其他建议(希望替代我想要的操作),请告诉我。我的编程经验有限,欢迎提出任何意见或建议。谢谢。
最佳答案
一种方法(还有许多其他方法):
// Somewhere outside of your "mysqlget":
func recordMyData(myString: NSString) {
// do whatever you want with myString here, it is now outside the closure
myTextField.text = myString
}
// Call the "recordMyData" method from inside the closure to pass the response to it
let myDataTask = NSURLSessions.sharedSession().dataTaskWithRequest(myRequest, completion handler: {(requestData, requestResponse, requestError) -> Void in
self.recordMyData(NSString(data: requestData, encoding: NSUTF8StringEncoding)!)
})