如何从我的 NetworkingService 响应访问我的 HomeViewController 中的用户属性??
我能够在我的 NetworkingService 中打印所有用户,但我需要在我的 HomeViewController 中的 ViewDidLoad 中访问它们。
到目前为止,这是我在 NetworkingService 中打印属性的代码:
import Foundation
class NetworkingService {
static let shared = NetworkingService()
let session = URLSession.shared
func getUsers(success successBlock: @escaping (GetUsersResponse) -> Void) {
guard let url = URL(string: "") else
{ return }
session.dataTask(with: url) { (data, response, error) in
if let error = error { print(error); return }
do {
let decoder = JSONDecoder()
let dateFormatter = DateFormatter()
dateFormatter.locale = Locale(identifier: "en_US_POSIX")
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
decoder.dateDecodingStrategy = .formatted(dateFormatter)
let result = try decoder.decode(Root.self, from: data!)
for user in result.users {
print(user.id ?? "", user.name ?? "", user.userName ?? "", user.createdDate ?? "", user.profileImage ?? "")
}
} catch {
print(error)
}
}.resume()
}
}
上面的代码打印了 NetworkingService 内部的所有用户,但我需要在我的 ViewController 中访问它们,如下所示:
import UIKit
class HomeViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate {
let usersArray: [String] = []
override func viewDidLoad() {
super.viewDidLoad()
NetworkingService.shared.getUsers { (response) in
}
}
//Number of views
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return usersArray.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let userCell = collectionView.dequeueReusableCell(withReuseIdentifier: "UserCollectionViewCell", for: indexPath) as! UserCollectionViewCell
userCell.backgroundColor = UIColor.green
return userCell
}
}
我也有这个用户结构:
import Foundation
struct Root: Decodable {
let users: [User]
}
struct User : Decodable {
let id: Int?
let name: String?
let userName: String?
let profileImage: URL?
let createdDate: Date?
}
以及当前什么都不做的 GetUserResponse 结构:
import Foundation
struct GetUsersResponse {
}
如何让打印在我的 NetworkingService 中的值显示在我的 HomeViewController ViewDidLoad 的标签中?非常感谢!!
最佳答案
你需要
var usersArray = [Users]()
NetworkingService.shared.getUsers { (response) in
self.usersArray = response
DipsatchQueue.main.async {
self.collectionView.reloadData()
}
}
并改变
func getUsers(success successBlock: @escaping ([Users]) -> Void) {
guard let url = URL(string: "") else
{ return }
session.dataTask(with: url) { (data, response, error) in
if let error = error { print(error); return }
do {
let decoder = JSONDecoder()
let dateFormatter = DateFormatter()
dateFormatter.locale = Locale(identifier: "en_US_POSIX")
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
decoder.dateDecodingStrategy = .formatted(dateFormatter)
let result = try decoder.decode(Root.self, from: data!)
for user in result.users {
print(user.id ?? "", user.name ?? "", user.userName ?? "", user.createdDate ?? "", user.profileImage ?? "")
}
success(result.users ?? [] )
} catch {
print(error)
}
}.resume()
}
同时更改 cellForItemAt
以显示每个用户可能在集合单元格内附加的 UILabel
outlets 中
关于ios - 如何从我的 NetworkingService 响应访问我的 HomeViewController 中的用户属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57136425/