プログラミングの観点からは、コードの書き方が原因で、必ずしもこれを回避できるとは限りません。
基本的に、疑似コードで:
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" が出力されます。