Swift变量值和函数

时间:2016-04-21 01:33:26

标签: swift

我有一段代码,其中初始化了一个可选项,然后在函数中分配了一个值,但在解包时是nill

var datastring: String?
Alamofire.request(.POST, "https://example.url/request", parameters: parameters) .response { request, response, data, error in
    datastring = NSString(data: data!, encoding:NSUTF8StringEncoding) as! String // there is data in here
    // textView.text = datastring!  datastring is not nill when here
}    
textView.text = datastring! // datastring is nill when here

这不是Alamofire特有的。在使用原生Swift方法时,我遇到了这个问题。我做错了什么,为什么Swift会这样做?

PS。我还在学习:)。

编辑:谢谢所有帮助过我的人。为了澄清问题,这是一个将变量值从异步线程传递到主线程的问题。我只是不知道如何说出来。

2 个答案:

答案 0 :(得分:3)

您正在更新闭包中的datastring变量。传递给Alamofire的代码将在稍后执行(也许可能在几微秒之后)。因此,在关闭执行之前,首先将datastring分配给textView

请改为尝试:

var datastring: String?

Alamofire.request(.POST, "https://example.url/request", parameters: parameters).response { request, response, data, error in
    datastring = NSString(data: data!, encoding: NSUTF8StringEncoding) as! String

    dispatch_async(dispatch_get_main_queue()) {
        textView.text = datastring
    }
}  

使用dispatch_async调用可确保在主线程上进行UI更新。

网络请求可能会在几秒钟(或更长时间)内发生,因此您可能希望使用临时字符串更新UI,以便用户在等待时看到某些内容。

答案 1 :(得分:0)

这两行

datastring = NSString(data: data!, encoding:NSUTF8StringEncoding) as! String // there is data in here
textView.text = datastring! // datastring is not nill when here

立即运行,因为它们位于闭包内。 Alamofire决定何时进行关闭。