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

ios - 如何将从 Internet 下载的数据保存到内部设备?


                                            <p><p>我有这个代码:</p>

<pre><code>struct ServerConnect {
    enum Result&lt;T&gt; {
      case succes(T)
      case error(String)
    }

    typealias completionHandler = (Result&lt;Data &gt;) -&gt; ()

    func getJsonFromServer(parameters: String, completion: @escaping completionHandler) {
      let fullUrlString = ApiConstans.fullPath + parameters
      guard let url = URL(string: fullUrlString) else {
            debugPrint(&#34;\(ErrorsLabels.ServerConnect01)&#34;)
            return completion(.error(&#34;\(ErrorsLabels.ServerConnect01)&#34;))
      }

      URLSession.shared.dataTask(with: url) {(data, response, error) in
            guard error == nil else {
                debugPrint(&#34;\(ErrorsLabels.ServerConnect02)&#34;)
                return completion(.error(&#34;\(ErrorsLabels.ServerConnect02)&#34;))
            }

            guard let data = data else {
                debugPrint(&#34;\(ErrorsLabels.ServerConnect03)&#34;)
                return completion(.error(&#34;\(ErrorsLabels.ServerConnect03)&#34;))
            }

            debugPrint(&#34;R&gt; \(fullUrlString)&#34;)
            return completion(.succes(data))
            }.resume()
    }


    func getJsonProducts(lang: String?, region: Int?, completion: @escaping completionHandler) {
      self.getJsonFromServer(parameters: &#34;?action=GET_PRODUCTS&amp;lang=\(lang!)&amp;region=\(region!)&#34;, completion: completion)
    }

}
</code></pre>

<p>我想将从互联网下载的数据保存在设备的内存中。</p>

<p>我正在尝试这段代码:</p>

<pre><code>getJsonProducts(lang: selectedLanguage, region: selectedRegion , completion: { (data) in
                  print(&#34;@@@@@ \(data)&#34;)
                     saveJsonFileToTheDisk(path: selectedLanguage + &#34;/json/products.json&#34;,downloadData: data)
                })

func saveJsonFileToTheDisk(path: String, downloadData: Data){
      do {
            let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
            let fileURL = documentsURL.appendingPathComponent(path)
            try downloadData.write(to: fileURL, options: .atomic)
      } catch { }
    }
</code></pre>

<p>但不幸的是,它不起作用。我怎样才能让它发挥作用?</p>

<p>以下是错误:</p>

<blockquote>
<p>Cannot convert value of type &#39;ServerConnect.Result&#39; to expected
argument type &#39;Data&#39;</p>
</blockquote></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>根据<code>getJsonProducts</code>方法的定义:</p>

<pre><code>func getJsonProducts(lang: String?, region: Int?, completion: @escaping (Result&lt;Data&gt;) -&gt; ()) {
</code></pre>

<p>发送到<code>completion</code> block 的参数<code>data</code>实际上是包含数据的<code>Result</code>类型,而不是数据本身。因此,您应该这样做:</p>

<pre><code>getJsonProducts(lang: selectedLanguage, region: selectedRegion, completion: { result in
    switch result {
    case .succes(let data):
      saveJsonFileToTheDisk(path: selectedLanguage + &#34;/json/products.json&#34;,downloadData: data)
    case .error(let errorMessage):
      // Do something with the error message.
      break
    }
})
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 如何将从 Internet 下载的数据保存到内部设备?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/50445705/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/50445705/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 如何将从 Internet 下载的数据保存到内部设备?