在启动之前在拳头选项卡视图控制器上加载数据
Load data on fist tab view controller before it launch
我正在开发 Swift 2.2.
中的应用程序
我从初始模板创建了一个选项卡式应用程序。然后,我向我的 FirstViewController class 添加了一些代码,以便下载、解析和显示一些 JSON 格式的数据。
这是我的 FirstViewController.swift 文件的内容:
import UIKit
class FirstViewController: UIViewController {
@IBOutlet weak var siteNameLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
var siteName = ""
let requestURL: NSURL = NSURL(string: "http://wheretogo.com.mx/backends/service.php")!
let urlRequest: NSMutableURLRequest = NSMutableURLRequest(URL: requestURL)
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithRequest(urlRequest) {
(data, response, error) -> Void in
let httpResponse = response as! NSHTTPURLResponse
let statusCode = httpResponse.statusCode
if (statusCode == 200) {
//print("Everyone is fine, file downloaded successfully.")
do{
let json = try NSJSONSerialization.JSONObjectWithData(data!, options:.AllowFragments)
if let appInfo = json["appInfo"] as? [[String: AnyObject]] {
siteName = appInfo[0]["siteName"] as! String
self.siteNameLabel.text = siteName
}
}catch {
print("Error with Json: \(error)")
}
}
}
task.resume()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
获取和解析数据确实有效。问题是数据仅在我 select 第二个选项卡然后返回到第一个选项卡时显示。
加载标签时,它具有默认文本,当我转到另一个选项卡并返回到第一个时,它会发生变化,然后是 self.siteNameLabel.text = siteName。
我认为初始化可以解决它,但我不知道如何,或者延迟?
或者我如何在第一次加载视图控制器之前处理下载数据。
提前致谢。
这可能与您用来更新 UI 的线程有关。请注意,dataTaskWithRequest
使用的完成块是在后台线程上执行的。
由于 Apple 只允许 UI 更新在主线程上完成,您可以使用像这样的调度块来解决这个问题(如前所述 here):
dispatch_async(dispatch_get_main_queue(), {
self.siteNameLabel.text = siteName
})
此外,请注意,如果您希望 UI 所依赖的数据在每次显示 FirstViewController
时更新,您应该将代码放在 viewDidAppear
而不是 viewDidLoad
.
希望对您有所帮助!
我正在开发 Swift 2.2.
中的应用程序我从初始模板创建了一个选项卡式应用程序。然后,我向我的 FirstViewController class 添加了一些代码,以便下载、解析和显示一些 JSON 格式的数据。
这是我的 FirstViewController.swift 文件的内容:
import UIKit
class FirstViewController: UIViewController {
@IBOutlet weak var siteNameLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
var siteName = ""
let requestURL: NSURL = NSURL(string: "http://wheretogo.com.mx/backends/service.php")!
let urlRequest: NSMutableURLRequest = NSMutableURLRequest(URL: requestURL)
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithRequest(urlRequest) {
(data, response, error) -> Void in
let httpResponse = response as! NSHTTPURLResponse
let statusCode = httpResponse.statusCode
if (statusCode == 200) {
//print("Everyone is fine, file downloaded successfully.")
do{
let json = try NSJSONSerialization.JSONObjectWithData(data!, options:.AllowFragments)
if let appInfo = json["appInfo"] as? [[String: AnyObject]] {
siteName = appInfo[0]["siteName"] as! String
self.siteNameLabel.text = siteName
}
}catch {
print("Error with Json: \(error)")
}
}
}
task.resume()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
获取和解析数据确实有效。问题是数据仅在我 select 第二个选项卡然后返回到第一个选项卡时显示。
加载标签时,它具有默认文本,当我转到另一个选项卡并返回到第一个时,它会发生变化,然后是 self.siteNameLabel.text = siteName。
我认为初始化可以解决它,但我不知道如何,或者延迟?
或者我如何在第一次加载视图控制器之前处理下载数据。
提前致谢。
这可能与您用来更新 UI 的线程有关。请注意,dataTaskWithRequest
使用的完成块是在后台线程上执行的。
由于 Apple 只允许 UI 更新在主线程上完成,您可以使用像这样的调度块来解决这个问题(如前所述 here):
dispatch_async(dispatch_get_main_queue(), {
self.siteNameLabel.text = siteName
})
此外,请注意,如果您希望 UI 所依赖的数据在每次显示 FirstViewController
时更新,您应该将代码放在 viewDidAppear
而不是 viewDidLoad
.
希望对您有所帮助!