2016-04-21 83 views
0

我有一段代码,其中可选项已初始化,然后在函数中为其分配值,但在解包时为nillSwift变量值和函数

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。我还在学习:)

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

+3

datastring被设置在回调(异步)内部。同时,主线程继续运行,因此当textView.text设置时,变量中没有任何内容。您需要将您的值传回给另一个回调中的主线程。 – ohiodoug

+0

[Alamofire request up up up nil]的可能重复(http://stackoverflow.com/questions/35372850/alamofire-request-coming-up-nil) – jtbandes

+0

@ohiodoug谢谢你解释这一点。这是我不明白的。 –

回答

3

您正在更新闭包中的变量datastring。这是传递给Alamofire稍后执行的代码(可能稍后几微秒)。因此,在闭包执行之前,首先发生datastringtextView的行。

试试这个:

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,以便用户在等待时看到某些内容。

+0

谢谢你解释。你的和@ ohiodoug的解释帮助了我很多。标记这个答案,因为dispatch_async我需要回到主线程。 –

+0

真棒,很高兴帮助。另外,由于你是Swift新手,尽量避免使用'!'。你应该考虑使用'!'作为可能的崩溃点。我的团队实际上称他们为“碰撞爆炸”。 –

+0

@DaveWood,'碰撞刘海' - 我喜欢那样。 (哦,你好。) – NRitH

0

这两条线

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

立即运行,因为他们是一个封闭的内部。由Alamofire决定何时执行结案。