iOSparsingSDK:将多个查询结果放入数组中

scheme=我有一个应用程序,用户可以发送消息,评论和PPSE查询填充当前用户的通知TableView。 有三个查询必须发生,一个消息,两个评论,三个扑克。 我正在使用的代码是…

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

什么是需要的=巩固以下数组:“消息”,“戳”和“注释”到一个单一的数组(notificationsArray),我可以通过“createdAt”sorting并通过通知ArrayList objectAtIndexPath:indexPath.row填充我的notificationsView视图。

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

(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); 

它logging“消息=(空)”。 我不能为了我的生活找出为什么它没有被设置。 我知道有消息,因为当我NSLog的“对象”数组来自查询它给了我想要的。 这就像查询的内容不会离开查询本身的范围。 以上所有查询都是这样做的。 如果我不能从该块中获取查询的内容,那么我不能创build一个数组的所有数组来填充notificationsTableView,所以我搞砸了。 请帮忙。

(2)即使我从查询中得到了单个数组的结果,我不知道如何创build一个数组的数组,并通过一个键来sorting。 谁能帮我这个? 请。

(1)您在callback函数之外logging消息,日志在callback函数返回之前。 尝试在分配消息之后立即将消息logging到callback中。

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

(2)在sorting之前,创build一个NSMutableArray,并为每个检索的数组使用addObjectsFromArray:方法。

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

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

希望这个帮助!

编辑:你可以embedded你的临时NSMutableArray到一个自动释放池,以避免无用的内存泄漏,以便专用内存在您继续显示之后被释放。

编辑:你可以使用orQueryWithSubqueriesparsing方法合并几个请求到一个单一的。 在你的情况下,这并不烦人,因为你正在根据他们的createdAt键对PFObject进行sorting,这是每个PFObject的共同点。 在任何情况下,您都必须检查PFObjecttypes以根据其types显示它们。 请看这里的完整文档 。 不适用于返回几种对象的查询!

您可能正在寻找+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... { 

至于第二个错误,你是对的,价值不被保留,因为当块失去范围内的所有本地variables里面被autoreleasepool销毁。 你需要通过使用一个强大的财产保留这一点。 self.messages = objects;