Parse,iOS,includeKey查询不检索指针对象的属性

时间:2015-03-26 16:06:12

标签: ios swift pointers parse-platform

我很擅长使用Parse,我正在建立一个todo列表作为CRM的一部分。表视图中的每个任务都显示描述,截止日期和客户端名称。描述和截止日期在我的Task类中,以及指向Deal类的指针。客户端是Deal类中的字符串。我能够正确查询描述和截止日期,但我无法使用includeKey从Deal对象中检索客户端属性。我按照includeKey的Parse文档进行了操作。

描述和截止日期在结果表视图中正确显示,但不在客户端显示。日志显示client label: nil,打印的任务详细信息包括<Deal: 0x7ff033d1ed40, objectId: HffKOiJrTq>,但不包含客户端属性。 如何在表格视图中检索指针对象的属性(客户端)并将其指定给我的标签?我的相关代码如下。提前谢谢。

修改:我已根据此SO answer使用func fetchClients()更新了我的代码,但我仍不确定我的功能是否完整或在何处调用。

class TasksVC: UITableViewController {


var taskObjects:NSMutableArray! = NSMutableArray()

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)

    println("\(PFUser.currentUser())")

    self.fetchAllObjects()
    self.fetchClients()

}

func fetchAllObjects() {

    var query:PFQuery = PFQuery(className: "Task")

    query.whereKey("username", equalTo: PFUser.currentUser()!)

    query.orderByAscending("dueDate")
    query.addAscendingOrder("desc")

    query.includeKey("deal")

    query.findObjectsInBackgroundWithBlock { (tasks: [AnyObject]!, error:NSError!) -> Void in

        if (error == nil) {

            var temp:NSArray = tasks! as NSArray
            self.taskObjects = temp.mutableCopy() as NSMutableArray

            println(tasks)   

            self.tableView.reloadData()

        } else {

            println(error?.userInfo)

        }
    }
}

func fetchClients() {
    var task:PFObject = PFObject(className: "Task")
    var deal:PFObject = task["deal"] as PFObject

    deal.fetchIfNeededInBackgroundWithBlock {
        (deal: PFObject!, error: NSError!) -> Void in
        let client = deal["client"] as NSString
    }
}

//MARK: - Tasks table view
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 1
}

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

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = self.tableView.dequeueReusableCellWithIdentifier("TaskCell", forIndexPath: indexPath) as TaskCell

    var dateFormatter:NSDateFormatter = NSDateFormatter()
    dateFormatter.dateFormat = "M/dd/yy"

    var task:PFObject = self.taskObjects.objectAtIndex(indexPath.row) as PFObject

    cell.desc_Lbl?.text = task["desc"] as? String
    cell.date_Lbl.text = dateFormatter.stringFromDate(task["dueDate"] as NSDate)
    cell.client_Lbl?.text = task["client"] as? String

    var clientLabel = cell.client_Lbl?.text
    println("client label: \(clientLabel)")

    return cell

}

}

1 个答案:

答案 0 :(得分:3)

如果deal列是指针,那么includeKey("deal")将获取该对象并为您填充它的属性。除此之外,无需执行任何类型的fetch

你真的应该正确使用Optionals:

if let deal = task["deal"] as? PFObject {
  // deal column has data
  if let client = deal["client"] as? String {
    // client has data
    cell.client_Lbl?.text = client
  }
}

或者你可以用这样的行替换最后的if let,它处理空值并使用默认值:

cell.client_Lbl?.text = (deal["client"] as? String) ?? ""

在您发布的cellForRowAtIndexPath代码中,您尝试从任务而不是交易中读取客户端:task["client"] as? String