快速

时间:2015-07-29 11:45:52

标签: php ios json swift

我有php文件检查从swift ios传递的值,我打印json数据,这是代码:

<?php
$said = $_REQUEST['sa_id'];
if($said == '123456') {
    $returnValue = array("said" => "true");
}else{
    $returnValue = array("said" => "false");
}
echo json_encode($returnValue);
?>

另外我写了一个swift函数来检查返回的所述值,我的代码在第二次单击时工作成功,我想从第一次点击:

class ViewController: UIViewController {

    var saidResult = false;

    @IBOutlet var saidField: UITextField!
    @IBOutlet var labelField: UILabel!

    override func viewDidLoad(){
        super.viewDidLoad()
    }   

    @IBAction func checkSAID(sender: UIButton) {

        if ( isValidSAID(saidField.text) == false ) {
            labelField.text = "SAID is Invalid"
        } else {
            labelField.text = "Done"
        }
    }

    func isValidSAID(said2Test: String) -> Bool {

        let myUrl = NSURL(string: "http://*****.com/said.php");
        let request = NSMutableURLRequest(URL:myUrl!);
        request.HTTPMethod = "POST";

        // Compose a query string
        let postString = "sa_id=\(said2Test)";

        request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding);
        let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
            (data, response, error) in
            if error != nil {
                println("error=\(error)")
                return
            }

            // You can print out response object
            println("response = \(response)")

            // Print out response body
            let responseString = NSString(data: data, encoding: NSUTF8StringEncoding)
            println("responseString = \(responseString)")

            //Let's convert response sent from a server side script to a NSDictionary object:
            var err: NSError?
            var myJSON = NSJSONSerialization.JSONObjectWithData(data, options: .MutableLeaves, error:&err) as? NSDictionary

            if let parseJSON =myJSON {
                // Now we can access value of First Name by its key
                var saidValue = parseJSON["said"] as? String
                println("saidValue: \(saidValue)")

                if ((saidValue) == "true" ) {
                    self.saidResult = true;
                }

                println("saidResult: \(self.saidResult)");
            }
        }
        task.resume()
        println("saidResult: \(self.saidResult)");
        if ( self.saidResult == true ){
            return true
        } else {
            return false
        }

    }

}

正如我所说的那样,在第一次点击时,sayResult的值为false,但在此之后它取真值

我如何解决这个问题,还是有其他方法来改进我的代码?

2 个答案:

答案 0 :(得分:0)

我认为这可能是因为第一次点击时没有应答http请求,而是第二次点击时。

您可以尝试用此替换checkSAID函数。

@IBAction func checkSAID(sender: UIButton) {

    let saidQueue = dispatch_queue_create("saidQueue", DISPATCH_QUEUE_CONCURRENT)

    // Do the checking on a background thread.
    dispatch_async(saidQueue, {
        if ( isValidSAID(saidField.text) == false ) {
    // As the UI updates are performed on the main queue, update the label on the main queue.
            dispatch_async(dispatch_get_main_queue()) {
                labelField.text = "SAID is Invalid"
            })
        } else {
            dispatch_async(dispatch_get_main_queue()) {
                labelField.text = "Done"
            })
        }
    })

}

答案 1 :(得分:0)

最后,经过4天的测试,我解决了我的问题。

我更改了isValidSAID功能代码:

func isValidSAID(said2Test: String) -> Bool {

    var status: String = "";

    let myUrl = NSURL(string: "http://*****.com/said.php?sa_id=\(said2Test)");
    let data = NSData(contentsOfURL: myUrl!)
    let json = NSHSONSerialization.JSONObjectWithData(data!, option: nil, error: nil) as! NSDictionary

    status = (json["said"] as? String)!
    println(status)

    return ( status == "true" ) ? true : false
}

并解决了我的问题。