首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可能的种族状况?Swift 2 iOS应用程序不随机调用func tableView(tableView )

可能的种族状况?Swift 2 iOS应用程序不随机调用func tableView(tableView )
EN

Stack Overflow用户
提问于 2016-04-14 15:15:16
回答 3查看 574关注 0票数 2

我正在开发一个应用程序,它接受用户输入(一个8-10位数字),并将其发布到一个php脚本中,后者会查询数据库并以JSON的形式返回结果。

我解析JSON并将值保存到数组中,然后将这些数组加载到tableView中。

用户点击search,它向一个新视图引入了一个segue (通过Nav控制器),JSON数据被发送到表视图,在viewDidLoad()中,我解析JSON并将它保存在数组中,在func tableView中,我将数组中的值读取到行中,然后返回单元格。

我的问题是,有时数据不加载在行中,尽管数组总是被填充,但我得到一个空白的表视图,我单击back并再次尝试搜索,并且它工作.然后随机停下来几次。

我确实为表视图单击了委托和数据源。我在plist中添加了HTTP异常。

这是我的第一个项目,所以任何提示都是值得赞赏的。我怀疑我的代码位置可能是导致种族状况的一个问题?因为我在viewDidLoad()函数中解析了JSON?

代码:

代码语言:javascript
复制
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
}
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-04-14 15:36:23

它看起来像是背景线程处理的一个问题:

代码语言:javascript
复制
let task = NSURLSession.sharedSession().dataTaskWithRequest(request)

可能在后台线程内部,然后在同一线程上设置表数据源/委托。

试着交换:

代码语言:javascript
复制
        self.tableView.delegate = self
        self.tableView.dataSource = self

使用

代码语言:javascript
复制
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() })

票数 3
EN

Stack Overflow用户

发布于 2016-04-14 15:32:30

你不应该把这么多东西塞进viewDidLoad里。而且,一旦您有了数据,就需要调用reloadData(),否则tableView将不会刷新。唯一不需要调用reloadData()的时间是在创建tableView时数据可用时。

在未来,保持代码的整洁和良好的格式化。这对你的帮助比任何事都重要。草率的代码将导致草率的结果和无穷无尽的未来头痛。

代码语言:javascript
复制
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()
}
票数 1
EN

Stack Overflow用户

发布于 2016-04-14 15:40:21

加载数据后,应该调用reloadData (在主线程中)

代码语言:javascript
复制
...
print("Finished populating arrays")
dispatch_async(dispatch_get_main_queue(), {
   self.tableView.reloadData()
});
...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36627311

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档