Swift变量值和函数
我有一段代码,其中可选项已初始化,然后在函数中为其分配值,但在解包时为nill
?Swift变量值和函数
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。我还在学习:)
编辑:谢谢所有帮助我的人。为了澄清问题,这是一个将变量的值从异步线程传递到主线程的问题。我只是不知道该怎么说。
您正在更新闭包中的变量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,以便用户在等待时看到某些内容。
谢谢你解释。你的和@ ohiodoug的解释帮助了我很多。标记这个答案,因为dispatch_async我需要回到主线程。 –
真棒,很高兴帮助。另外,由于你是Swift新手,尽量避免使用'!'。你应该考虑使用'!'作为可能的崩溃点。我的团队实际上称他们为“碰撞爆炸”。 –
@DaveWood,'碰撞刘海' - 我喜欢那样。 (哦,你好。) – NRitH
这两条线
datastring = NSString(data: data!, encoding:NSUTF8StringEncoding) as! String // there is data in here
textView.text = datastring! // datastring is not nill when here
是不立即运行,因为他们是一个封闭的内部。由Alamofire决定何时执行结案。
datastring被设置在回调(异步)内部。同时,主线程继续运行,因此当textView.text设置时,变量中没有任何内容。您需要将您的值传回给另一个回调中的主线程。 – ohiodoug
[Alamofire request up up up nil]的可能重复(http://stackoverflow.com/questions/35372850/alamofire-request-coming-up-nil) – jtbandes
@ohiodoug谢谢你解释这一点。这是我不明白的。 –