Skip to main content
 首页 » 操作系统

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

2024年01月01日64yjmyzz

我对使用 Parse 还很陌生,我正在构建一个待办事项列表作为 CRM 的一部分。 TableView 中的每个任务都显示描述、截止日期和客户名称。描述和截止日期在我的 Task 类中,还有一个指向 Deal 类的指针。 Client 是 Deal 类中的一个字符串。我能够正确查询描述和截止日期,但我无法使用 includeKey 从 Deal 对象中检索客户端属性。 .我遵循了 includeKey 的 Parse 文档.

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

编辑:我用 func fetchClients() 更新了我的代码基于此SO answer ,但我仍然不确定我的功能是否完整或在哪里调用它。

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 
 
} 
 
} 

请您参考如下方法:

如果 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?字符串.