菜鸟教程小白 发表于 2022-12-11 17:20:19

ios - 从异步调用函数返回数据并在swift中调用webservice后保存变量


                                            <p><p>我的代码有效,但无法将返回的内容保留在变量中。
我只能打印但不能作为将它们存储在变量中的调用。
我附加了用于 web 服务的类,因为我现在正在调用对象。</p>

<pre><code>class WebService{

    class func llamarWebService(completionHandler: (datos:NSArray)-&gt;()){

      let urlPath = &#34;http://aaaaaaaaa.com.ar/aaaaaaaaa/forwarder_number?phone=0000000000&#34;
      let url = NSURL(string: urlPath)
      let session = NSURLSession.sharedSession()
      var arreglo:NSArray!
      let task = session.dataTaskWithURL(url!,completionHandler: {data,response,error -&gt; Void in

            if (error != nil){
                print(error?.localizedDescription)
            }

            let nsdata: NSData = NSData(data: data!)

            arreglo = self.retornarDatos(nsdata)
            completionHandler(datos: arreglo)


      })
      task.resume()
    }

    class func retornarDatos(nsdata: NSData)-&gt; Array&lt;String&gt;{

      let datos = NSString(data:nsdata,encoding: NSUTF8StringEncoding)
      let partes = datos?.componentsSeparatedByString(&#34;,&#34;)
      var arreglo : = []
      for i in partes!{
            arreglo.append(i)
      }

      return arreglo
    }

}
</code></pre>

<p>在 ViewController 中使用这个</p>

<pre><code> var resultadoWebService = WebService.llamarWebService{
    datos in print(,datos,datos,datos,datos])
}
</code></pre>

<p>我需要保存例如:</p>

<pre><code>var1 = datos
var2 = datos
</code></pre>

<p>实际上代码在控制台中显示我</p>

<blockquote>
<p></p>
</blockquote></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>首先,使用 <code>resultadoWebService</code> 毫无意义。所以我会像这样简化你的代码段:</p>

<pre><code>WebService.llamarWebService { datos in
    print(,datos,datos,datos,datos])
}
</code></pre>

<p>其次,您询问了有关更新变量的问题。实际上,虽然更新局部变量没有意义,但也许您想更新调用对象的属性。如果是这样,请在闭包内更新它们,然后触发任何适合结果的 UI 更新(或其他):</p>

<pre><code>var var1: String?
var var2: String?

func performRequestAndUpdateUI() {
    WebService.llamarWebService { datos in
      guard datos.count == 5 else {
            print(&#34;didn&#39;t get the number of items data I expected&#34;)
            return
      }

      guard datos == &#34;OK&#34; else {
            print(&#34;not everything was OK&#34;)
            return
      }

      // note, you probably want to dispatch all model updates to the main queue
      // to simplify synchronization. also UI updates must happen on main queue,
      // too.

      dispatch_async(dispatch_get_main_queue()) {
            self.var1 = datos
            self.var2 = datos
            ...
            // do whatever UI updates you want here
      }
    }

    // but don&#39;t try to use `datos` results here, because the above runs
    // asynchronously and we don&#39;t have the result by the time we get here
    // in our code.
}
</code></pre>

<p>现在,<code>datos</code> 是否总是有五个项目,以及是否要检查 <code>datos</code> 是否 <code>OK</code> 已全部完成给你,但希望它说明了这个想法,即你正在处理一个异步方法,所以你不能立即使用在闭包中传回的值,而是你必须将它们的使用限制在闭包中本身。如果您要更新模型和/或 UI,请确保将其分派(dispatch)回主线程。但是您不能立即更新变量,因为来自 Web 服务的响应是异步的,并且直到稍后才会被调用。</p>

<hr/>

<p>我可能会建议一个更安全(更简单)的 <code>retornarDatos</code>,它消除了 <code>!</code> 强制解包操作符,可能使用像这样的可选链:</p>

<pre><code>class func retornarDatos(data: NSData) -&gt; ? {
    return String(data: data, encoding: NSUTF8StringEncoding)?
      .componentsSeparatedByString(&#34;,&#34;)
}
</code></pre>

<p>或者,如果您<em>真的</em>想在出现错误时返回一个空字符串数组,如当前版本,您可以这样做:</p>

<pre><code>class func retornarDatos(data: NSData) -&gt; {
    return String(data: data, encoding: NSUTF8StringEncoding)?
      .componentsSeparatedByString(&#34;,&#34;) ?? ()
}
</code></pre>

<hr/>

<p>顺便说一句,我建议您拥抱上述代码/概念,但是一旦您这样做了,您可能需要重新评估您的 Web 服务设计。我建议考虑使用 JSON 作为响应,因为解析过程更健壮,并且更容易区分基本 Web 服务错误和成功返回某些内容的 Web 服务(无论它是否“正常”)。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 从异步调用函数返回数据并在swift中调用webservice后保存变量,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/39105876/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/39105876/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 从异步调用函数返回数据并在swift中调用webservice后保存变量