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

时间:2018-05-21 09:27:22

标签: ios iphone swift swift3

我有这段代码:




  struct ServerConnect {
枚举结果< T> {
案例成功(T)
 case error(String)
 }

 typealias completionHandler =(结果<数据>) - > ()

 func getJsonFromServer(参数:String,completion:@escaping completionHandler){
 let fullUrlString = ApiConstans.fullPath + parameters
 guard let url = URL(string:fullUrlString)else {
 debugPrint( “\(ErrorsLabels.ServerConnect01)”)
返回完成(.error(“\(ErrorsLabels.ServerConnect01)”))
 }

 
中的URLSession.shared.dataTask(with:url){(data,response,error)警卫错误== nil else {
 debugPrint( “\(ErrorsLabels.ServerConnect02)”)
返回完成(.error(“\(ErrorsLabels.ServerConnect02)”))
 }

 guard let data = data else {
 debugPrint( “\(ErrorsLabels.ServerConnect03)”)
返回完成(.error(“\(ErrorsLabels.ServerConnect03)”))
 }

 debugPrint(“R> \(fullUrlString)”)
返回完成(.succes(data))
 } .resume()
 }


 func getJsonProducts(lang:String?,region:Int?,completion:@escaping completionHandler){
 self.getJsonFromServer(参数:“?action = GET_PRODUCTS& lang = \(lang!)& region = \(region!)”,完成:完成)
 }

}
  




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

我正在尝试此代码:

&#xA;&#xA;
  getJsonProducts(lang:selectedLanguage,region:selectedRegion,completion :{(data)in&#xA; print(“@@@@@(data)”)&#xA; saveJsonFileToTheDisk(path:selectedLanguage +“/ json / products.json”,downloadData:data)&#xA; } && xA;&#xA; func saveJsonFileToTheDisk(path:String,downloadData:Data){&#xA;做{&#xA; let documentsURL = FileManager.default.urls(for:.documentDirectory,in:.userDomainMask).first!&#xA; let fileURL = documentsURL.appendingPathComponent(path)&#xA;尝试downloadData.write(to:fileURL,options:.atomic)&#xA; } catch {}&#xA; }&#xA;  
&#xA;&#xA;

但不幸的是它不起作用。我怎样才能使它工作?

&#xA;&#xA;

以下是一个错误:

&#xA;&#xA;
&#xA;

无法将“ServerConnect.Result”类型的值转换为预期的&#xA;参数类型'数据'

&#xA;
&#xA;

2 个答案:

答案 0 :(得分:0)

根据getJsonProducts方法的定义:

func getJsonProducts(lang: String?, region: Int?, completion: @escaping (Result<Data>) -> ()) {

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

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
    }
})

答案 1 :(得分:0)

来自NA的{​​{1}}会返回completionHandler,而不是简单的getJsonProducts,因此您需要对Result<Data>实例进行模式匹配,因为它可能不会实际上包含Data,可能包含Result错误。

Data