Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift变量值和函数_Swift - Fatal编程技术网

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的术语
撞车刘海
:)