ios - 如何将从 Internet 下载的数据保存到内部设备?
<p><p>我有这个代码:</p>
<pre><code>struct ServerConnect {
enum Result<T> {
case succes(T)
case error(String)
}
typealias completionHandler = (Result<Data >) -> ()
func getJsonFromServer(parameters: String, completion: @escaping completionHandler) {
let fullUrlString = ApiConstans.fullPath + parameters
guard let url = URL(string: fullUrlString) else {
debugPrint("\(ErrorsLabels.ServerConnect01)")
return completion(.error("\(ErrorsLabels.ServerConnect01)"))
}
URLSession.shared.dataTask(with: url) {(data, response, error) in
guard error == nil else {
debugPrint("\(ErrorsLabels.ServerConnect02)")
return completion(.error("\(ErrorsLabels.ServerConnect02)"))
}
guard let data = data else {
debugPrint("\(ErrorsLabels.ServerConnect03)")
return completion(.error("\(ErrorsLabels.ServerConnect03)"))
}
debugPrint("R> \(fullUrlString)")
return completion(.succes(data))
}.resume()
}
func getJsonProducts(lang: String?, region: Int?, completion: @escaping completionHandler) {
self.getJsonFromServer(parameters: "?action=GET_PRODUCTS&lang=\(lang!)&region=\(region!)", completion: completion)
}
}
</code></pre>
<p>我想将从互联网下载的数据保存在设备的内存中。</p>
<p>我正在尝试这段代码:</p>
<pre><code>getJsonProducts(lang: selectedLanguage, region: selectedRegion , completion: { (data) in
print("@@@@@ \(data)")
saveJsonFileToTheDisk(path: selectedLanguage + "/json/products.json",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 'ServerConnect.Result' to expected
argument type 'Data'</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<Data>) -> ()) {
</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 + "/json/products.json",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]