parsingiOS SDK:无法从数组中获取对象

我有一个显示Facebook朋友的数据的表格视图。 数据存储在Parse上,我将它拉下来并使用以下查询将数据存储在“postArray”中。 我已经使用NSLog来检查postArray对象,我正在得到所需的结果。

会发生什么是我得到的数据存储在postArray的总和设置为适当的标签,然后一些只剩下空。 正如我所说,我做了NSLog postArray,它给了我想要的。 但是,当我去设置数据,它不会设置所有的数据,但只是一些。

问题1 – >我需要所有的数据都可以从数组访问,它不让我。

问题#2 – >是否在运行时加载任何东西是碰到还是错过。 如果我login并注销一枚硬币,它是否会加载任何东西。 我的NSLog postArray,它似乎有时数组是空的。 我知道你在想什么 – “你有时要给我一些比”有时候“更好的东西,但是我真的不能这样做。

请帮助我,告诉我这是怎么回事!

(和dispatch_async没有区别)

我一直在做什么=

[[FBRequest requestForMyFriends] startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) { if (!error) { friendDict = result; friendArray = friendDict[@"data"]; for (NSDictionary *friendObject in friendArray) { friendIDs = [NSMutableArray arrayWithObjects:[friendObject objectForKey:@"id"], nil]; PFQuery *postQuery = [PFQuery queryWithClassName:@"Post"]; [postQuery whereKey:@"postedByID" containedIn:friendIDs]; [postQuery orderByAscending:@"createdAt"]; [postQuery findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { dispatch_async(dispatch_get_main_queue(), ^{ postArray = objects; [self.activityTableView reloadData]; }); }]; } } else { //there are errors } }]; 

我可以看到一些方法,这个代码可能会出错。 首先,每当内部查找完成时,postArray就会被replace。 其次,内部发现的结构是有问题的,快速连续发起N个asynchronous调用,然后更新每个竞争表。

考虑一下这个方法:我们build立一些可以和完成块一起运行的方法。 最简单的一个基于userId职位PFQuery

 - (void)getPostsForId:(NSString *)userId withCompletion:(void (^)(NSArray *, NSError *))completion { PFQuery *postQuery = [PFQuery queryWithClassName:@"Post"]; [postQuery whereKey:@"postedByID" containedIn:@[userId]]; [postQuery orderByAscending:@"createdAt"]; [postQuery findObjectsInBackgroundWithBlock:completion]; } 

第二个是有趣的。 这解决了一系列asynchronous调用的问题,在启动下一个之前完成一个完成,只有在完成时才调用完成块。

它通过使用用户ID数组作为待办事项列表并自动recursion地调用它,将结果收集到一个可变数组中。 当待办事项列表完成(空白)时,它会调用它自己的完成代码块:

 - (void)getPostsForIds:(NSArray *)ids results:(NSMutableArray *)results completion:(void (^)(BOOL))completion { if (ids.count == 0) return completion(YES); NSString *userId = ids[0]; NSArray *remainingIds = [ids subarrayWithRange:NSMakeRange(1, ids.count-1)]; [self getPostsForId:userId withCompletion:^(NSArray *posts, NSError *error) { if (!error) { [results addObjectsFromArray:posts]; [self getPostsForIds:remainingIds results:results completion:completion]; } else { completion(NO); } }]; } 

现在开始的方法可以简化。 从FB中获取朋友列表,构build他们的ID数组,并调用上面的魔术函数:

 - (void)getFriendsPosts { [[FBRequest requestForMyFriends] startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) { if (!error) { friendDict = result; friendArray = friendDict[@"data"]; NSMutableArray *ids = [NSMutableArray array]; for (NSDictionary *friendObject in friendArray) { [ids addObject:[friendObject objectForKey:@"id"]]; } NSMutableArray *allPosts = [NSMutableArray array]; [self getPostsForIds:ids results:allPosts completion:^(BOOL success) { // EDIT - be sure to use the resulting allPosts as your datasource self.theModelForMyTable = allPosts; [self.activityTableView reloadData]; // if !success do an alert or something }]; } }]; } 

数据源方法应该只引用表模型,所以例如numberOfRowsInSection应该回答self.theModelForMyTable.count和cellForRowAtIndexPath应该总是从self.theModelForMyTable[indexPath.row]获取数据来configuration单元self.theModelForMyTable[indexPath.row]