我有一段代码,其中初始化了一个可选项,然后在函数中分配了一个值,但在解包时是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。我还在学习:)。
编辑:谢谢所有帮助过我的人。为了澄清问题,这是一个将变量值从异步线程传递到主线程的问题。我只是不知道如何说出来。答案 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决定何时进行关闭。