0

プログラミングの観点からは、コードの書き方が原因で、必ずしもこれを回避できるとは限りません。

基本的に、疑似コードで:

if NSUserDefaults' stored token exists{

    setFlag(token)
    // setFlag will make an API call with the token and either set Global.variable to true or leave it at false

    if(Global.variable){doThis()}

}

基本的に条件チェックは setFlag が終了する前に行われるため、チェック時に true になることはありません。didSetFlagFinishExecuting の行に沿って 2 番目のグローバル ブール値を追加しても、同じ問題が発生します。条件付きは他のものより前に発生します。while ループに入れたのですが、コーディングの仕方が原因で無限ループに陥ってしまいました。スレッドロック/GCD の経験がありません。私はそれを使用しないことを好みますが、必要に応じて使用します。助言がありますか?

編集:実際のコード

// viewDidLoad で

let defaults = NSUserDefaults.standardUserDefaults()
    if let stringOne = defaults.valueForKey("sessionKey") as? String{
        getStatus(stringOne)
        if(Global.loggedIn){ // do whatever--won't happen

// ViewController の拡張として

func getStatus(sessionKey: String){
    let url :  String = "http://whatever" + sessionKey

    let request : NSMutableURLRequest = NSMutableURLRequest()
    request.URL = NSURL(string: url)
    request.HTTPMethod = "GET"
    var queue : NSOperationQueue = NSOperationQueue()
    var returnString : String = ""

    NSURLConnection.sendAsynchronousRequest(request, queue: queue, completionHandler:{(response:NSURLResponse!, responseData:NSData!, error: NSError!) -> Void in

        if error != nil
        {
            println(error.description)
            returnString = error.description
        }
        else
        {


            var errors: NSError?

            let jsonData:NSDictionary = NSJSONSerialization.JSONObjectWithData(responseData!, options: NSJSONReadingOptions.MutableContainers, error: &errors) as! NSDictionary

            var tempString = jsonData["last_status"] as! String!
            print(tempString)
            if (tempString == "loggedin"){
                Global.loggedIn = true
            }
            Global.finished = true
            print("hello")




          }




        }

    })




}

したがって、ここで最後に Global.loggedIn を出力すると、true になります。これは時間内に終了するだけではありません。return 関数にしても、なんらかの理由で viewDidLoad の条件が false として読み取られ、THEN "hello" が出力されます。

4

1 に答える 1