用于解析查询数据的iOS swift tableview单元格

时间:2015-01-25 08:01:11

标签: swift

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as UITableViewCell
    var query = PFQuery(className:"category")
    let object = objects[indexPath.row] as String  

    query.whereKey("type", equalTo:"DRUM")
    query.findObjectsInBackgroundWithBlock {
        (objects: [AnyObject]!, error: NSError!) -> Void in
        if error == nil {
            for object in objects {
                NSLog("%@", object.objectId)
                let abc = object["link"]
                println("the web is \(abc)")

            cell.textLabel!.text = "\(abc)"
            }
        } else {
            NSLog("Error: %@ %@", error, error.userInfo!)
        }
    }
    return cell
}

screenshot 添加let object = objects[indexPath.row] as String后无法加载视图,删除该行只显示一行成功。

2 个答案:

答案 0 :(得分:0)

首先,我建议您在cellForRowAtIndexPath之外获取您的单元格数据。此函数不是从解析接收数据的好地方。创建另一个函数并创建一个类变量并放置句柄从那里获取数据。

let object = objects[indexPath.row] as String  
for object in objects 

尽量不要为不同的东西使用相同的变量名称,因为它们会让你感到困惑。

这条线在目前似乎没有任何贡献。尝试删除它:

let object = objects[indexPath.row] as String  

答案 1 :(得分:0)

首先让我们考虑原则。不要从单独的线程更新UI,其行为是意外的或未定义的。它工作或工作很奇怪。

其次,你遇到的问题是当VC加载时,tableView的数据源在那里被调用,然后在主线程上被调用。现在,您尝试通过在单独的线程中执行异步调用来在单元格上添加一些内容,这将需要一些时间,主线程在调用解析时不会等待。如果您在Async中遇到困难,请查看文档,这对于掌握少数术语和原则非常重要。

事情是你的主线程从上到下运行,而不等待每个对服务器的调用,即在单元生成中异步。因此该调用的结果将在稍后发布,您也不会在主线程上发布。

此外,我建议你不要为大项目或可管理的代码库做这种方法。我通常做的是:

  1. 当视图加载时使用所需信息调用Parse
  2. 在计算变量上等待,我将观察到重新加载表视图一旦我符合我的数据。
  3. 最初表视图将有0行,那很好。在那段时间里,我会做一个旋转舞者。
  4. 我希望我能澄清一些问题。希望它能帮到你。干杯!

     //a computed var that is initialized to empty array of string or anything you like
    //we are observing the value of datas. Observer Pattern.
    var datas = [String](){
        didSet{
            dispatch_async(dispatch_get_main_queue(), {
                //we might be called from the parse block which executes in seperate thread
                tableView.reloadData()
            })
        }
    }
    
    func viewDidLoad(){
        super.viewDidLoad()
        //call the parse to fetch the data and store in the above variable 
        //when this succeeds then the table will be reloaded automatically
        getDataFromParse()
    }
    
    
    //get the data: make it specific to your needs
    func getDataFromParse(){
        var query = PFQuery(className:"category")
        //let object = objects[indexPath.row] as String         //where do you use this in this block
        var tempHolder = [String]()
    
        query.whereKey("type", equalTo:"DRUM")
        query.findObjectsInBackgroundWithBlock {
            (objects: [AnyObject]?, error: NSError?) -> Void in
            if error == nil && objects != nil {
                for object in objects!{
                    //dont forget to cast it to PFObject
                    let abc = (object as! PFObject).objectForKey("link") as? String ?? ""   //or as! String
                    println("the web is \(abc)")
                    tempHolder.append(abc)
                }
            } else {
                print("error")  //do some checks here
            }
        }
    }
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! UITableViewCell
        cell.textLabel!.text = datas[indexPath.row]
        return cell
    }