目的:

在用户界面的“文本”字段中键入数字。按“开始!”按钮(用户界面)和:
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)!)
})

07-28 12:23