免责声明-我是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 /链接中获取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 }
有人可以给我建议如何实现这一目标吗?
答案 0 :(得分:1)
您可以使用以下函数在UICollectionView
中填充本地json数据
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()
}
答案 1 :(得分:0)
do{
if let jsonObject: AnyObject = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers) as? [String: AnyObject] as AnyObject? {
if let dict = jsonObject as? NSDictionary {
if isDebuging {
print(dict)
}
} else {
print("not a dictionary")
}
}
else {
if isDebuging {
print("Could not parse JSON: \(error!)")
}
}
}catch let error as NSError {
print(error.localizedDescription)
}