【问题标题】:Data from url doesn't load. Although URL is correct来自 url 的数据不会加载。虽然网址是正确的
【发布时间】:2020-04-01 16:53:51
【问题描述】:
DispatchQueue.global().async{
        do{
            let url = URL(string: "https://www.hackingwithswift.com/samples/friendface.json")!
            let data = try Data(contentsOf: url)

            let decoder = JSONDecoder()
            decoder.dateDecodingStrategy = .iso8601


            let downloadedFriends = try decoder.decode([Friend].self, from: data)

            DispatchQueue.main.async {
                self.friends = downloadedFriends
                self.tableView.reloadData()
            }
        }catch{
            print(error.localizedDescription)
        }
    }

它打印:“数据无法读取,因为它丢失了。” 我检查了网址hackingwithswift,它是正确的

【问题讨论】:

  • 不要使用Data(contentsOf:)作为远程资源URL,使用正确的URLSession方法dataTask
  • 从不在解码 catch 块中打印 error.localizedDescription。打印error,它会准确告诉您哪里出了问题。

标签: swift networking swift5


【解决方案1】:

我认为问题出在您的 Friend 结构中。您需要检查每个字段是否正确。虽然我强烈推荐使用app.quicktype.io 来自动生成可编码结构

这是正确的朋友结构:


// MARK: - Friend
struct Friend: Codable {
    var id: String?
    var isActive: Bool?
    var name: String?
    var age: Int?
    var company, email, address, about: String?
    var registered: Date?
    var tags: [String]?
    var friends: [FriendElement]?
}

// MARK: - FriendElement
struct FriendElement: Codable {
    var id, name: String?
}

【讨论】:

    【解决方案2】:

    Shynggys,我目前也在使用 JSONDecoder,并将您的代码与我的代码进行了比较。我在 DispatchQueue 类的 async 方法中对您的代码做了一些小改动,并从 URL 中取回了数据。屏幕打印中的第 30 行。

    我还使用了 David 建议的 Friend 结构,因为您没有在帖子中包含所有代码。

    import UIKit
    
    struct Friend: Codable {
        var id: String?
        var isActive: Bool?
        var name: String?
        var age: Int?
        var company, email, address, about: String?
        var registered: Date?
        var tags: [String]?
        var friends: [FriendElement]?
    }
    
    // MARK: - FriendElement
    struct FriendElement: Codable {
        var id, name: String?
    }
    
    DispatchQueue.global().async{
        do{
            let url = URL(string: "https://www.hackingwithswift.com/samples/friendface.json")!
            let data = try Data(contentsOf: url)
    
            let decoder = JSONDecoder()
            decoder.dateDecodingStrategy = .iso8601
    
            let downloadedFriends = try decoder.decode([Friend].self, from: data)
    
            DispatchQueue.main.async {
                let friends = downloadedFriends //remove self, and assign to friends
    //            self.tableView.reloadData()
                print (friends)
            }
        }catch{
            print(error.localizedDescription)
        }
    }
    

    控制台中的结果:

    【讨论】:

      猜你喜欢
      • 2016-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-15
      • 1970-01-01
      • 2013-01-18
      • 2011-03-09
      • 1970-01-01
      相关资源
      最近更新 更多