gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 06:56:14 26 4
gpt4 key购买 nike

我刚刚完全掌握 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()
})

最佳答案

据推测,您的“将在任务完成时发生”代码正在除 main 之外的某个线程/队列上运行,这与 UI 更新不兼容。任何接触 UI 的事情都必须在主队列上完成。

你应该调整你的代码,以便在你处理完一切。为此,将上述两个调用包装在发送到主队列的异步调度中:

dispatch_async(dispatch_get_main_queue(), ^{

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

});

这将确保 cellContent 数组在更新主队列上的 UI 时不会“在 TableView 的背后”被修改(糟糕!)并且 TableView 不会尝试再次更新,直到完成任何正在进行的更新。

希望对您有所帮助。

关于ios - 修改行数组时,Swift 2 数据不会重新加载数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33566967/

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