gpt4 book ai didi

ios - 在 UICollectionView 中解析本地 JSON 文件

转载 作者:搜寻专家 更新时间:2023-10-31 22:53:12 24 4
gpt4 key购买 nike

我是 Swift/IOS 开发的新手。

正在关注 this教程 通过执行以下操作,我能够获取/显示本地 JSON 文件(实际上是 .txt 文件):

guard let path = Bundle.main.path(forResource: "test", ofType: "txt") else { return cell }
let url = URL(fileURLWithPath: path)

do{
let data = try Data(contentsOf: url)
let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers)

guard let array = json as? [Any] else {return cell}

for user in array {
guard let userDict = user as? [String: Any] else { return cell }
guard let mName = userDict["name"] as? String else { return cell }
print(mName)
}

}catch{
print(error)
}

这工作正常,它打印出我文件中的所有名称。


接下来,我想将此数据填充到 UICollectionView 中。所以我关注了this教程。但在教程中,他从 api/link 获取 JSON 数据,如下所示:

import UIKit

typealias JSON = [String: Any]

class NetworkingService {

static let shared = NetworkingService()
private init() {}

let session = URLSession.shared

func getImgurs(success successBlock: @escaping (GetImgursResponse) -> Void) {
guard let url = URL(string: "https://api.imgur.com/3/gallery/r/dogs") else { return }
var request = URLRequest(url: url)
request.addValue("Client-ID 40dfbed2b6935ec", forHTTPHeaderField: "authorization")

session.dataTask(with: request) { (data, _, _) in
guard let data = data else { return }
do {
guard let json = try JSONSerialization.jsonObject(with: data, options: []) as? JSON else { return }
print(json)
let getImgursResponse = try GetImgursResponse(json: json)
DispatchQueue.main.async {
successBlock(getImgursResponse)
}
} catch {}
}.resume()
}

func downloadImage(fromLink link: String, success successBlock: @escaping (UIImage) -> Void) {
guard let url = URL(string: link) else { return }
session.dataTask(with: url) { (data, _, _) in
guard let data = data,
let image = UIImage(data: data)
else { return }
DispatchQueue.main.async {
successBlock(image)
}
}.resume()
}
}

我首先尝试通过更改 url 来使用与第一个教程相同的逻辑,如下所示:

import UIKit

typealias JSON = [String: Any]

class NetworkingService {

static let shared = NetworkingService()
private init() {}

let session = URLSession.shared

func getImgurs(success successBlock: @escaping (GetImgursResponse) -> Void) {
//Changing the URL to local path
guard let path = Bundle.main.path(forResource: "test", ofType: "txt") else { return }
let url = URL(fileURLWithPath: path)

var request = URLRequest(url: url)
request.addValue("Client-ID 40dfbed2b6935ec", forHTTPHeaderField: "authorization")

session.dataTask(with: request) { (data, _, _) in
guard let data = data else { return }
do {
guard let json = try JSONSerialization.jsonObject(with: data, options: []) as? JSON else { return }
print(json)
let getImgursResponse = try GetImgursResponse(json: json)
DispatchQueue.main.async {
successBlock(getImgursResponse)
}
} catch {}
}.resume()
}

func downloadImage(fromLink link: String, success successBlock: @escaping (UIImage) -> Void) {
guard let url = URL(string: link) else { return }
session.dataTask(with: url) { (data, _, _) in
guard let data = data,
let image = UIImage(data: data)
else { return }
DispatchQueue.main.async {
successBlock(image)
}
}.resume()
}
}

但随后它返回 guard let json = try JSONSerialization.jsonObject(with: data, options: []) as? JSON else { return }

我怎样才能做到这一点?

最佳答案

您可以使用以下函数将本地 json 数据填充到 UICollectionView

func getUsersList() -> [Any]{
guard let path = Bundle.main.path(forResource: "test", ofType: "txt") else { return [] }
let url = URL(fileURLWithPath: path)

do{
let data = try Data(contentsOf: url)
let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers)

guard let array = json as? [Any] else {return []}

return array;

}catch{
print(error)
return []
}
}

从函数中获取列表后,然后像这样使用相同的数组重新加载集合:

var arrUsersLists : [Any] = []

override func viewDidLoad() {
super.viewDidLoad()

self.arrUsersLists = self.getUsersList()
self.collectionView.reloadData()
}

关于ios - 在 UICollectionView 中解析本地 JSON 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55914400/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com