从编程的角度来看,由于代码的编写方式,我不一定能解决这个问题。
基本上,在伪代码中:
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 完成之前,因此在检查时它永远不会为真。即使我沿着 didSetFlagFinishExecuting 的行添加第二个全局布尔值,我也会遇到同样的问题——条件发生在其他问题之前。我把它放在一个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,那将是真的。只是这些都没有及时完成。即使我将其设为返回函数,无论出于何种原因,viewDidLoad 中的条件都会将其读取为 false,然后将打印“hello”。