gpt4 book ai didi

ios - Swift 3/iOS UIView 在检索远程 JSON 数据后不更新

转载 作者:可可西里 更新时间:2023-11-01 01:18:06 25 4
gpt4 key购买 nike

我有一个包含用户列表的 UITableView。当您点击一行时,用户的 uid 将传递到 UIViewController 详细 View 。 URLRequest 用于检索用户的 JSON 数据(用户名、头像等)。但是,详细 View 不一致地更新信息。有时它会显示用户名、头像等,但有时它什么也不显示,或者只显示用户名或只显示头像等。

fetchUser() 方法中,我有一个 print("Username:\(self.user.username)") 显示正在检索正确的数据100% 的时间,但它不会在 View 中 100% 的时间显示它。

如有任何帮助,我们将不胜感激。

谢谢!

class ProfileViewController: UIViewController {

@IBOutlet weak var avatarImageView: UIImageView!
@IBOutlet weak var usernameLabel: UILabel!
@IBOutlet weak var networthLabel: UILabel!

var user: User!
var uid: Int?

override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
}

override func viewDidLoad() {
super.viewDidLoad()

// Do any additional setup after loading the view.
fetchUser()
}

func reloadView() {
self.usernameLabel.text = user.username
self.networthLabel.text = "$" + NumberFormatter.localizedString(from: Int((user.networth)!)! as NSNumber, number: NumberFormatter.Style.decimal)
self.avatarImageView.downloadImage(from: user.avatar!)
circularImage(photoImageView: self.avatarImageView)
}

func fetchUser() {
// Post user data to server
let myUrl = NSURL(string: "http://localhost/test/profile")
let urlRequest = NSMutableURLRequest(url: myUrl! as URL);
urlRequest.httpMethod = "POST"

let postString = "uid=\(uid!)"

urlRequest.httpBody = postString.data(using: String.Encoding.utf8)

let task = URLSession.shared.dataTask(with: urlRequest as URLRequest) { (data, response, error) in

if (error != nil) {
print("error=\(String(describing: error))")
return
} // end if

self.user = User()

do {

let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? [String : AnyObject]

if let parseJSON = json?["data"] as? [[String : AnyObject]] {

for userFromJson in parseJSON {

let userData = User()

if let uid = userFromJson["uid"] as? String,
let username = userFromJson["username"] as? String,
let networth = userFromJson["networth"] as? String,
let avatar = userFromJson["avatar"] as? String {

userData.uid = Int(uid)
userData.username = username
userData.networth = networth
userData.avatar = avatar

self.usernameLabel.text = username
self.networthLabel.text = networth
self.avatarImageView.downloadImage(from: avatar)
circularImage(photoImageView: self.avatarImageView)

} // end if

self.user = userData

} // end for

} // end if

DispatchQueue.main.async {
print("Username: \(self.user.username)")
self.reloadView()
}

} catch let error {
print(error)
}
}
task.resume()

}

最佳答案

首先,在 viewWillAppear 中调用获取用户,如下所示:

override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(动画)
获取用户()
}

然后,像我一样更改这里的代码,不要使用您拥有的reloadView 函数,而是在fetchUser< 的末尾更新主线程上的UI 元素功能。我还更改了它,这样您就不会更新 UI 两次,因为在更新 UI 的 fetchUser 中,if let uid = ... 语句的底部有 4 行不在主线程中的元素,这就是为什么在我的版本中我删除了那 4 行代码。如果这对您有用,请告诉我。

let task = URLSession.shared.dataTask(with: urlRequest as URLRequest) { (data, response, error) in

if (error != nil) {
print("error=\(String(describing: error))")
return
} // end if

self.user = User()

do {

let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? [String : AnyObject]

if let parseJSON = json?["data"] as? [[String : AnyObject]] {

for userFromJson in parseJSON {

let userData = User()

if let uid = userFromJson["uid"] as? String,
let username = userFromJson["username"] as? String,
let networth = userFromJson["networth"] as? String,
let avatar = userFromJson["avatar"] as? String {

userData.uid = Int(uid)
userData.username = username
userData.networth = networth
userData.avatar = avatar

} // end if

self.user = userData

} // end for

} // end if

DispatchQueue.main.async {
self.usernameLabel.text = user.username
self.networthLabel.text = "$" + NumberFormatter.localizedString(from: Int((user.networth)!)! as NSNumber, number: NumberFormatter.Style.decimal)
self.avatarImageView.downloadImage(from: user.avatar!)
circularImage(photoImageView: self.avatarImageView)
}

} catch let error {
print(error)
}
}
task.resume()

关于ios - Swift 3/iOS UIView 在检索远程 JSON 数据后不更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45361454/

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