将URL数据保存到变量

时间:2015-01-29 03:07:12

标签: ios swift nsurlsession dispatch-async

所以我试图从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)
}

2 个答案:

答案 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。你没有做任何需要在主线程上完成的工作。