我正在开发一个应用程序,它接受用户输入(一个8-10位数字),并将其发布到一个php脚本中,后者会查询数据库并以JSON的形式返回结果。
我解析JSON并将值保存到数组中,然后将这些数组加载到tableView中。
用户点击search,它向一个新视图引入了一个segue (通过Nav控制器),JSON数据被发送到表视图,在viewDidLoad()中,我解析JSON并将它保存在数组中,在func tableView中,我将数组中的值读取到行中,然后返回单元格。
我的问题是,有时数据不加载在行中,尽管数组总是被填充,但我得到一个空白的表视图,我单击back并再次尝试搜索,并且它工作.然后随机停下来几次。
我确实为表视图单击了委托和数据源。我在plist中添加了HTTP异常。
这是我的第一个项目,所以任何提示都是值得赞赏的。我怀疑我的代码位置可能是导致种族状况的一个问题?因为我在viewDidLoad()函数中解析了JSON?
代码:
import UIKit
class ResultsViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
@IBOutlet weak var tableView: UITableView!
var ccnit = ""
var cunsArray : [String] = []
var accountsArray : [String] = []
var statusArray : [String] = []
var typesArray : [String] = []
var assignedArray : [String] = []
override func viewDidLoad() {
super.viewDidLoad()
//establish connection
let url = NSURL(string: "http:IPADDRESS/App/query.php")
let request = NSMutableURLRequest(URL:url!)
request.HTTPMethod = "POST"
request.HTTPBody = ccnit.dataUsingEncoding(NSUTF8StringEncoding)
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
data, response, error in
if error != nil {
print("error=\(error)")
return
}
//print("response = \(response)")
// let responseString = NSString(data: data!, encoding: NSUTF8StringEncoding)!
//print("responseString = \(responseString)")
//parse JSON
do {
let jsonArray = try (NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers)) as! NSArray
//loop through json array and take out strings
var counter = 0
while counter < jsonArray.count{
let cun = jsonArray[counter]["ticket_no"] as? String
self.cunsArray.append(cun!)
let account = jsonArray[counter]["accountname"] as? String
self.accountsArray.append(account!)
let status = jsonArray[counter]["status"] as? String
self.statusArray.append(status!)
let type = jsonArray[counter]["category"] as? String
self.typesArray.append(type!)
let assigned_to = jsonArray[counter]["assigned_to"] as? String
self.assignedArray.append(assigned_to!)
counter = counter + 1
}
if (self.cunsArray.count > 0)
{
print("cunsArray has \(self.cunsArray.count) items")
}
if (self.accountsArray.count > 0)
{
print("accountsArray has \(self.accountsArray.count) items")
}
print("Finished populating arrays")
self.tableView.delegate = self
self.tableView.dataSource = self
} catch let err {
print(err)
}
}
task.resume()
// Do any additional setup after loading the view.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return cunsArray.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell = self.tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! CustomCell
//print("*****inside tableview func")
print("returning cells")
// cell.account.text = ""
cell.cun.text = cunsArray[indexPath.row]
cell.account.text = accountsArray[indexPath.row]
cell.status.text = statusArray[indexPath.row]
cell.type.text = typesArray[indexPath.row]
cell.assigned_to.text = assignedArray[indexPath.row]
return cell
}
}发布于 2016-04-14 15:36:23
它看起来像是背景线程处理的一个问题:
let task = NSURLSession.sharedSession().dataTaskWithRequest(request)可能在后台线程内部,然后在同一线程上设置表数据源/委托。
试着交换:
self.tableView.delegate = self
self.tableView.dataSource = self使用
dispatch_async(dispatch_get_main_queue(), {() -> Void in
self.tableView.delegate = self
self.tableView.dataSource = self
})编辑:
正如Jeremy Herrero所述,数据源/委托可能已经添加到故事板级别,如果是这样,正确的解决方案是:
dispatch_async(dispatch_get_main_queue(),{() -> self.tableView.reloadData() })
发布于 2016-04-14 15:32:30
你不应该把这么多东西塞进viewDidLoad里。而且,一旦您有了数据,就需要调用reloadData(),否则tableView将不会刷新。唯一不需要调用reloadData()的时间是在创建tableView时数据可用时。
在未来,保持代码的整洁和良好的格式化。这对你的帮助比任何事都重要。草率的代码将导致草率的结果和无穷无尽的未来头痛。
override func viewDidLoad() {
super.viewDidLoad()
self.tableView.delegate = self
self.tableView.dataSource = self
getData()
}
func getData() {
let url = NSURL(string: "http:IPADDRESS/App/query.php")
let request = NSMutableURLRequest(URL:url!)
request.HTTPMethod = "POST"
request.HTTPBody = ccnit.dataUsingEncoding(NSUTF8StringEncoding)
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
data, response, error in
if error != nil {
print("error=\(error)")
return
}
do {
let jsonArray = try (NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers)) as! NSArray
var counter = 0
var accounts = []
while counter < jsonArray.count {
let cun = jsonArray[counter]["ticket_no"] as? String
self.cunsArray.append(cun!)
let account = jsonArray[counter]["accountname"] as? String
self.accountsArray.append(account!)
let status = jsonArray[counter]["status"] as? String
self.statusArray.append(status!)
let type = jsonArray[counter]["category"] as? String
self.typesArray.append(type!)
let assigned_to = jsonArray[counter]["assigned_to"] as? String
self.assignedArray.append(assigned_to!)
counter = counter + 1
}
if (self.cunsArray.count > 0) {
print("cunsArray has \(self.cunsArray.count) items")
}
if (self.accountsArray.count > 0) {
print("accountsArray has \(self.accountsArray.count) items")
}
tableView.reloadData()
} catch let err {
print(err)
}
}
task.resume()
}发布于 2016-04-14 15:40:21
加载数据后,应该调用reloadData (在主线程中)
...
print("Finished populating arrays")
dispatch_async(dispatch_get_main_queue(), {
self.tableView.reloadData()
});
...https://stackoverflow.com/questions/36627311
复制相似问题