从NURLSessions.sharedsessions()传递请求数据.dataTaskWithRequest

时间:2015-03-24 07:52:08

标签: php ios mysql swift

目的:

在用户界面的“文本”字段中键入数字。按“GO!”按钮(用户界面)和: 1.文本字段中的数字作为post变量传递到PHP脚本(通过NSURLSession..dataTaskWithRequest)。

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   走!按钮。

解决方案失败:

  1. 在我的datataskwithrequest上放置一个“ - > NSString”而不是void(块应该在Call Handler结束时终止)

  2. 设置mysqlget以返回NSString并且mysqlget的最后一行包含“return data_frominside_datataskwithrequest” - 数据无法在请求之外生存

  3. 尝试从dataTaskWithRequest块内部更新Textview.text - 即使textview的@IBOutlet在顶部声明正确,当我尝试执行“textview.text = data”时,xcode会提示 - 必须使用“自我”。暗示它看不到@IBOutlet?使用self.textview.text允许程序运行,但一旦到达该行就会崩溃。

  4. (我知道这通常很糟糕)在ViewController之外声明一个全局变量并使globalvariable = data。不知何故,变量仍为空白。

  5. 我已经测试了代码,所有部分都可以在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]
      }
    
    }
    

    简明扼要的问题:

    1. 如何从@IBAction GoClicked的myGetTask块中获取data_I_need?
    2. 很抱歉问题的长度。我只想提供完整的上下文。如果您想提出其他建议(希望作为我所期望的行动的替代方案),请告诉我。我的编程经验有限,欢迎任何意见或建议。谢谢。

1 个答案:

答案 0 :(得分:1)

一种方法(还有很多其他方法):

// 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)!)
})