iOS Parse SDK:将多个查询结果放入Array中

时间:2014-06-12 20:06:23

标签: ios parse-platform

场景=我有一个应用程序,用户可以相互发送消息,评论和Pokes,以填充当前用户的notificationsTableView。必须进行3个查询,一个用于消息,两个用于注释,三个用于Pokes。我正在使用的代码如下......

PFQuery *messageQuery = [PFQuery queryWithClassName:@"Message"];
[messageQuery whereKey:@"receiverID" equalTo:[PFUser currentUser][@"userID"]];
[messageQuery orderByDescending:@"createdAt"];
[messageQuery findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {

    messages = objects;    

}];

PFQuery *pokeQuery = [PFQuery queryWithClassName:@"Poke"];
[pokeQuery whereKey:@"receiverID" equalTo:[PFUser currentUser][@"userID"]];
[pokeQuery orderByDescending:@"createdAt"];
[pokeQuery findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {

    pokes = objects;    

}];

PFQuery *commentsQuery = [PFQuery queryWithClassName:@"Comment"];
[commentsQuery whereKey:@"receiverID" equalTo:[PFUser currentUser][@"userID"]];
[commentsQuery orderByDescending:@"createdAt"];
[commentsQuery findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {

    comments = objects;    

}];

需要什么=合并以下数组:“messages”,“pokes”和“comments”到单个数组(notificationsArray)中,我可以按“createdAt”排序,并使用notificationsArray objectAtIndexPath:indexPath填充我的notificationsTableView。行。

我遇到的问题=(有两个)

(1)当我在NSLog中查询任何这些查询的结果时......

PFQuery *messageQuery = [PFQuery queryWithClassName:@"Message"];
[messageQuery whereKey:@"receiverID" equalTo:[PFUser currentUser][@"userID"]];
[messageQuery orderByDescending:@"createdAt"];
[messageQuery findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {

    messages = objects;    

}];

NSLog(@"messages = %@", messages);

记录“messages =(null)”。我不能为我的生活弄清楚为什么它没有被设定。我知道有消息,因为当我NSLog来自查询的“对象”数组时,它给了我想要的东西。这就像查询的内容不会离开查询本身的范围。上面的所有查询都是这样做的。如果我无法从该块中获取查询的内容,那么我无法创建所有数组的数组来填充notificationsTableView,所以我搞砸了。请帮忙。

(2)即使我确实从查询中获得了各个数组的结果,我也不确定如何创建数组数组并通过键对它们进行排序。谁能帮我这个?请。

2 个答案:

答案 0 :(得分:1)

(1)您正在回调函数之外记录消息,并且在返回回调函数之前记录日志。在分配消息后,尝试将消息记录到回调中。

[messageQuery findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
    messages = objects;    
    NSLog(@"messages = %@", messages)
}];

(2)在排序之前,创建一个NSMutableArray并对每个检索到的数组使用addObjectsFromArray:方法。

要对通知进行排序,您应该使用NSSortDescriptor,这是一种描述如何根据包含的对象的格式对数组进行排序的机制。这是一个可以满足您需求的示例:

NSSortDescriptor *createdAtDescriptor = [[NSSortDescriptor alloc] initWithKey:@"createdAt" ascending:YES];
notificationsArray = [messages sortedArrayUsingDescriptors:@[createdAtDescriptor]];

希望这有帮助!

编辑:您可以将临时NSMutableArray嵌入到自动释放池中以避免无用的内存泄漏,以便在您继续显示之后释放专用内存。

编辑:您可以使用orQueryWithSubqueries Parse方法将多个请求合并为一个请求。在你的情况下并不烦人,因为你根据他们的createdAt键对PFObject进行排序,这对每个PFObject都是通用的。在任何情况下,您都必须检查PFObject类型以根据其类型显示它们。请参阅full documentation here对于返回多种对象的查询不起作用!

答案 1 :(得分:0)

您可能正在寻找+orQueryWithSubqueries:(NSArray *)queries方法,但我不了解返回值描述是什么:

a PFQuery that is the or of the passed in PFQueries

我认为这意味着||(或)?

你会这样做:

NSArray *queryArray = [NSArray arrayWithObjects:messageQuery,pokeQuery,commentsQuery,nil];
PFQuery *allQueries = [PFQuery orQueryWithSubqueries:queryArray];
[allQueries findObjects... {

至于第二个错误,你是对的,不保留值,因为当块丢失范围时,内部的所有局部变量都会在autoreleasepool中被销毁。您需要使用强大的属性来保留它。 self.messages = objects;