修改行数组时,Swift 2数据不会重新加载数据

时间:2015-11-06 12:37:11

标签: ios arrays json swift swift2

我只是完全掌握iOS开发和Xcode,并且我正在使用Swift 2学习它。我试图从URL获取一些JSON数据,将其拆分为快速Array,并将其显示在TableView中。我已设法将JSON数据拆分为Array,但我无法重新加载表格数据以使其显示此内容。这是我的代码:

//
//  ViewController.swift
//  Table JSON
//
//  Created by James Allison on 06/11/2015.
//  Copyright © 2015 James Allison. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

    var cellContent = ["this should be replaced","something","something else"]

    @IBOutlet weak var table: UITableView!
    override func viewDidLoad() {
        super.viewDidLoad()

        // construct url
        let url = NSURL(string: "http://127.0.0.1:8888/json.php")!

        let task = NSURLSession.sharedSession().dataTaskWithURL(url) { (data, response, error) -> Void in
            // the following will happen when the task is complete
            if let urlContent = data {

                var webContent =  NSString(data: urlContent, encoding: NSUTF8StringEncoding)

                // remove []
                webContent = webContent?.stringByReplacingOccurrencesOfString("[", withString: "")
                webContent = webContent?.stringByReplacingOccurrencesOfString("]", withString: "")

                // split by commas
                var webContentArr = webContent?.componentsSeparatedByString(",")

                var temp = ""
                // remove quote marks
                for var i = 0; i < webContentArr!.count; i++ {
                    temp = webContentArr![i]
                    temp = temp.stringByReplacingOccurrencesOfString("\"", withString: "")
                    webContentArr![i] = temp
                }

                print(webContentArr!)
                self.cellContent = webContentArr! as! Array
                self.table.reloadData()

            }
            else {
                // something failed
                print("Error: invalid URL or something.")
            }
        }
        task.resume()

    }

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

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "Cell")
        cell.textLabel?.text = cellContent[indexPath.row]

        return cell
    }

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


}

在我运行它的那一刻,表格显示原始的cellContent变量,但不显示新变量。没有错误产生,阵列打印好了。

编辑:感谢Joshua的回答。我最终使用以下代码来解决我的问题:

dispatch_async(dispatch_get_main_queue(), { () -> Void in
     self.cellContent = webContentArr! as! Array
     self.table.reloadData()
})

1 个答案:

答案 0 :(得分:1)

猜测,你的“将在任务完成时发生”代码正在除main之外的某个线程/队列上运行,这对于UI更新不能很好地运行。触摸UI的任何内容必须在主队列上完成。

您应该调整代码,以便在完成所有处理后,在主队列上安排cellContent的替换和对reloadData()的表视图的调用。为此,请将上述调用包装在发送到主队列的异步调度中:

dispatch_async(dispatch_get_main_queue(), ^{

    self.cellContent = webContentArr! as! Array
    self.table.reloadData()

});

这样可以确保cellContent数组不会被修改为“在表视图的后面”,而它正在更新主队列上的UI(坏!),并且表视图不再尝试更新它完成了任何持续的更新。

我希望这会有所帮助。