我正在解析来自 json 的数据并将它们放入变量然后使用这些变量来更改 UILabel 的值但是它们(UILabel)没有得到更新,我已经通过互联网搜索并且他们说这是结果从主线程以外的线程更新 UIlabel 但在这里我把它放在 viewController 中但仍然没有更新 这是我的代码:
import UIKit
class NewsContentViewController: UIViewController {
@IBOutlet weak var nuTitle: UILabel!
var namesArray = String()
var iD = String()
var description1 = String()
var iDArray = [String]()
@IBOutlet weak var tctView: UITextView!
override func viewDidLoad() {
super.viewDidLoad()
parseJSON()
nuTitle.text = self.namesArray
tctView.text = self.description1
// Do any additional setup after loading the view.
}
func parseJSON(){
let requestURL: NSURL = NSURL(string: "XXXXXX" + iD)!
print(requestURL)
let urlRequest: NSMutableURLRequest = NSMutableURLRequest(url: requestURL as URL)
let session = URLSession.shared
let task = session.dataTask(with: urlRequest as URLRequest) {
(data, response, error) -> Void in
let readableJSON = JSON(data: data! , options: JSONSerialization.ReadingOptions.mutableContainers, error: nil)
if let Name = readableJSON[0]["Title"].string as String! {
var ID = readableJSON[0]["Id"].intValue
var iDString = String (ID)
self.namesArray.append(Name)
var desc = readableJSON[0]["Description"].string as String!
var type = readableJSON[0]["Type_Name"].string
self.iDArray.append(iDString)
self.description1 = desc!
self.namesArray = Name
}
}
task.resume()
}
}
最佳答案
问题
这里的问题是parseJSON()
里面的任务会异步执行。到那时
nuTitle.text = self.namesArray
tctView.text = self.description1
即将执行,任务尚未返回结果。
请阅读有关 iOS 中线程的更多信息 here
解决方案
对于这种情况,一个合适的解决方案是添加一个 completionBlock
,它将返回您的数据。
override func viewDidLoad() {
super.viewDidLoad()
parseJSON { (description, name) in
DispatchQueue.main.async {
self.description1 = description
self.namesArray = name
nuTitle.text = self.namesArray
tctView.text = self.description1
}
}
}
func parseJSON(completion: @escaping (_ description: String, _ name: String) -> Void) {
let requestURL: NSURL = NSURL(string: "XXXXXX" + iD)!
print(requestURL)
let urlRequest: NSMutableURLRequest = NSMutableURLRequest(url: requestURL as URL)
let session = URLSession.shared
let task = session.dataTask(with: urlRequest as URLRequest) {
(data, response, error) -> Void in
let readableJSON = JSON(data: data! , options: JSONSerialization.ReadingOptions.mutableContainers, error: nil)
if let Name = readableJSON[0]["Title"].string as String! {
var ID = readableJSON[0]["Id"].intValue
var iDString = String (ID)
self.namesArray.append(Name)
var desc = readableJSON[0]["Description"].string as String!
var type = readableJSON[0]["Type_Name"].string
self.iDArray.append(iDString)
completion(desc!, Name)
}
}
task.resume()
}
关于ios - UILabel 没有在 ViewController swift3 中更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40422476/