所以我试图从RESTful API中获取一个简单的数据字符串。以下是响应的结果:
Hello
它没有格式化为XML或JSON或任何只是一个简单的字符串格式,因为一次只传回一个单词。所以这就是我的swift的样子:
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”变量中得到了正确的数据。但是当我进入dispatch_async()方法时,“str”变量变为零,我不知道为什么。我只是想在我班上的一个变量中保存单个单词,所以如果我完全错误,请告诉我。我真的很感激我能得到的任何帮助。谢谢!
好的,所以我应该在第一次发布时加入此内容。我也试过这个:
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()
但是当我这样做时,字符串不会在completionHandler完成后保留在self.spellCorrection变量中。所以我的问题是,在完成完成后,我应该怎么做才能将字符串保存在self.spellCorrection变量中?谢谢!
在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)
}
答案 0 :(得分:1)
您在答案的“更详细信息”部分添加的代码中已明确说明,即
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
,您尝试在异步dataTaskWithURL
块中设置之前将其打印出来。
异步块在后台执行,因此在块在主线程上执行后立即写入的代码,异步块中的代码将不会完成。这就是为什么self.spellCorrection
在异步块中正确打印的原因 - 因为在那一点上,代码已经明确执行了;但是你不能像在你那样直接在异步块之外打印更新的值,因为异步代码还没有完成执行。
所以,是的,您的self.spellCorrection
实际上已经设置正确,但您必须等到异步代码执行之后再检查新值。而检查更新值的万无一失的方法实际上是在异步块中打印它。
答案 1 :(得分:0)
我认为您不需要首先致电dispatch_async
。你没有做任何需要在主线程上完成的工作。