将URL数据保存到variables

所以我试图从RESTful API中获取简单的数据串。 以下是响应的样子:

Hello 

它没有用XML或JSON格式化,或者只是一个简单的string,因为一次只传递一个单词。 所以这里是我的快速的样子:

 let task = session.dataTaskWithURL(url!, completionHandler: { (data, response, error) -> Void in if error != nil { println("error: \(error.localizedDescription): \(error.userInfo)") } var withNewLine:NSString = NSString(data: data, encoding: NSUTF8StringEncoding)! let str:NSString = withNewLine.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()) dispatch_async(dispatch_get_main_queue(), { self.spellCorrection = str }) }) task.resume() 

在进入dispatch_async()方法之前,我在“str”variables中得到正确的数据。 但是,当我进入dispatch_async()方法的“str”variables变成零,我不知道为什么。 我只是试图把这个单词保存在我的类中的一个variables中,所以如果我正在做这个完全错误的让我知道。 我真的很感激任何帮助,我可以得到。 谢谢!

编辑

好的,所以我应该在第一次发布时join这个。 我也试过这个:

 let task = session.dataTaskWithURL(url!, completionHandler: { (data, response, error) -> Void in if error != nil { println("error: \(error.localizedDescription): \(error.userInfo)") } var withNewLine:NSString = NSString(data: data, encoding: NSUTF8StringEncoding)! self.spellCorrection = withNewLine.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()) }) task.resume() 

但是当我这样做完成后,string不会留在self.spellCorrectionvariables。 所以我的问题是,如何在completionHandler完成后将string保存在self.spellCorrectionvariables中? 谢谢!

更多细节

在viewDidLoad中:

 var spellCorrection: NSString = "" //First print println(self.spellCorrection) 

在我稍后调用的方法中,我有:

 func spellCheck() { var check: String = "http://theURL.com/?text=" + condenseWhitespace(self.lastTypedWord) let url = NSURL(string: check) let task = session.dataTaskWithURL(url!, completionHandler: { (data, response, error) -> Void in if error != nil { println("error: \(error.localizedDescription): \(error.userInfo)") } var withNewLine:NSString = NSString(data: data, encoding: NSUTF8StringEncoding)! self.spellCorrection = withNewLine.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()) }).resume() //Print after the completionHandler println(self.spellCorrection) } 

您在答案的“更多详细信息”部分添加的代码中已经清楚了,即

 let task: Void = session.dataTaskWithURL(url!, completionHandler: { (data, response, error) -> Void in // ... self.spellCorrection = withNewLine.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNew lineCharacterSet()) println(spellCorrection) }).resume() println(self.spellCorrection) 

通过直接在块之外打印self.spellCorrection ,您正试图在asynchronousdataTaskWithURL块中设置之前将其打印出来。

asynchronous模块在后台执行,因此在主模块执行代码后立即写入代码,asynchronous模块内的代码将不会完成。 这就是为什么self.spellCorrection在asynchronous块内打印正确的原因 – 因为那时代码已经执行了; 但是不能像以前那样直接在asynchronous块之外打印更新后的值,因为asynchronous代码还没有完成执行。

所以,是的,你的self.spellCorrection实际上已经被正确设置了,但是你必须等到asynchronous代码执行之后再检查新的值。 实际上,通过在asynchronous模块中打印来检查更新值的方法。

我不认为你需要首先调用dispatch_async 。 你没有做任何需要在主线程上完成的工作。