Swift变量值和函数
我有一段代码,其中一个可选项被初始化,然后在一个函数中被赋值,但在展开时是Swift变量值和函数,swift,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:NSUTF8Stri
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
这不是特定的。我在使用本机Swift方法时遇到了这个问题。我做错了什么?为什么Swift会这样工作
另外,我还在学习:)
编辑:谢谢所有帮助我的人。为了澄清这个问题,这是一个将变量的值从异步线程传输到主线程的问题。我只是不知道该怎么说 您正在更新闭包中的
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\u async
调用可确保在主线程上进行UI更新
网络请求可能在几秒钟(或更长时间)内不会发生,因此您可能希望使用临时字符串更新UI,以便用户在等待时看到一些内容。您正在更新闭包中的
数据字符串
变量。这是传递给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\u async
调用可确保在主线程上进行UI更新
网络请求可能在几秒钟(或更长时间)内不会发生,因此您可能希望使用临时字符串更新UI,以便用户在等待时看到一些内容。这两行
datastring = NSString(data: data!, encoding:NSUTF8StringEncoding) as! String // there is data in here
textView.text = datastring! // datastring is not nill when here
不会立即运行,因为它们位于闭合内部。由Alamofire决定何时运行关闭。这两行
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,谢谢您的解释。这是我不理解的。datastring是在回调内部设置的(异步)。同时,主线程继续运行,因此设置textView.text时,变量中没有任何内容。您需要在另一个回调中将您的值传递回主线程。可能重复@ohiodoug,谢谢您的解释。这是我不明白的。谢谢你解释。你和@ohiodoug的解释对我帮助很大。标记这一点就是答案,因为dispatch_async是我返回主线程所需要的。太棒了,很高兴能提供帮助。另外,由于您是Swift新手,请尽量避免使用
代码>尽可能多。你应该考虑使用<代码>!<代码>作为可能的崩溃点。我的团队实际上把它们叫做碰撞刘海
@DaveWood,碰撞刘海
——我喜欢这样。(哦,你好。)@NRitH哦,嘿,老队友!怎么样?顺便说一句,@clstroud的术语撞车刘海
:)谢谢你的解释。你和@ohiodoug的解释对我帮助很大。标记这一点就是答案,因为dispatch_async是我返回主线程所需要的。太棒了,很高兴能提供帮助。另外,由于您是Swift新手,请尽量避免使用代码>尽可能多。你应该考虑使用<代码>!<代码>作为可能的崩溃点。我的团队实际上把它们叫做碰撞刘海
@DaveWood,碰撞刘海
——我喜欢这样。(哦,你好。)@NRitH哦,嘿,老队友!怎么样?顺便说一句,@clstroud的术语撞车刘海
:)