转换后,TableViewController不会出现几秒钟

时间:2016-03-08 03:13:23

标签: ios swift uitableview uitabbarcontroller

我有一个带有四个tableview控制器的tabbarcontroller,它们由导航控制器连接。表格视图由XMLParser从互联网上下载图像和文本。当应用程序加载时,在启动画面后,屏幕会变黑并持续几秒钟,然后会出现第一个表格视图。 Tab键点击其他tableviews也滞后。当tableview控制器的数据被下载时,如何显示某些内容代替黑屏或无响应的界面?

其中一个表格视图的代码:

import UIKit

class TopicsTableViewController: UITableViewController, XMLParserDelegate {

var xmlParser : XMLParser!

override func viewDidLoad() {
    super.viewDidLoad()

    let url = NSURL(string: "http://sharontalon.com/feed")
    xmlParser = XMLParser()
    xmlParser.delegate = self
    xmlParser.startParsingWithContentsOfURL(url!)
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


// MARK: XMLParserDelegate method implementation

func parsingWasFinished() {
    self.tableView.reloadData()
}


// MARK: - Table view data source

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 1
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return xmlParser.arrParsedData.count
}


override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("idCell", forIndexPath: indexPath)


    let currentDictionary = xmlParser.arrParsedData[indexPath.row] as Dictionary<String, String>
    let url = currentDictionary["enclosure"]
    let data = NSData(contentsOfURL: url!.asNSURL) //make sure your image in this url does exist, otherwise unwrap in a if let check

    let description = currentDictionary["description"]


    cell.selectionStyle = UITableViewCellSelectionStyle.None
    cell.textLabel?.text = currentDictionary["title"]
    cell.detailTextLabel?.text = String(htmlEncodedString: description!)
            cell.detailTextLabel?.numberOfLines = 3;
    cell.textLabel?.numberOfLines = 2;

        cell.imageView?.image = UIImage(data: data!)


    return cell
}

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    return 80
}


override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    let dictionary = xmlParser.arrParsedData[indexPath.row] as Dictionary<String, String>
    let tutorialLink = dictionary["link"]
    let publishDate = dictionary["pubDate"]

    let tutorialViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("idTutorialViewController") as! TutorialViewController

    tutorialViewController.tutorialURL = NSURL(string: tutorialLink!)
    tutorialViewController.publishDate = publishDate

    showDetailViewController(tutorialViewController, sender: self)

}

2 个答案:

答案 0 :(得分:1)

这可能是由一个简单的线程问题引起的,给它一个镜头,如果它不起作用,我会尽力帮助你:

首先将资源繁重的操作移至后台线程:

override func viewDidLoad() {
    super.viewDidLoad()

     let url = NSURL(string: "http://sharontalon.com/feed")
     xmlParser = XMLParser()
     xmlParser.delegate = self

    dispatch_async(dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0), {
         self.xmlParser.startParsingWithContentsOfURL(url!)
    })
}

接下来,将任何将用户界面更新的代码移动到前台线程:

func parsingWasFinished() {
    dispatch_async(dispatch_get_main_queue(), {
        self.tableView.reloadData()
    })
}

如果这不能解决您的问题,请告诉我任何我将删除此答案并重新考虑您的问题。

答案 1 :(得分:0)

重新加载表数据必须位于要立即续订的表的主线程上。

func parsingWasFinished() {
    self.tableView.reloadData()
}

将是:

func parsingWasFinished() {
    dispatch_async(dispatch_get_main_queue(), {
        self.tableView.reloadData()
    })
}