我有一个显示Facebook朋友数据的表格视图。数据存储在Parse上,我将其下拉并使用以下查询将数据存储在“ postArray”中。我已经使用NSLog来检查postArray对象,并且得到了想要的结果。
发生的事情是,我将存储在postArray中的数据总和设置为适当的标签,然后将其中一些保留为空。就像我说的,我做了NSLog postArray,它给了我想要的东西。但是当我去设置数据时,它并不会设置所有数据,而只是设置一些数据。
问题#1->我需要所有数据都可以从数组中访问,但不能让我失望。
问题#2->是否在运行时加载任何东西,这是命中注定的。如果我登录并注销它的硬币投掷,它是否还会加载任何东西。我的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。其次,内部查找的结构存在问题,快速连续发起N个异步调用,然后在每个竞争时更新表。
考虑这种替代方法:我们构建了一些可以在完成块上异步运行的方法。最简单的方法是根据PFQuery
对帖子进行userId
:
- (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];
}
第二个是有趣的。这解决了进行一系列异步调用的问题,先完成一个,然后再启动下一个,然后仅在全部完成时才调用它的完成块。
通过使用用户ID数组作为待办事项列表并递归调用自身,将结果收集在可变数组中,可以做到这一点。待办事项列表完成后(空),它将调用其自己的完成块:
- (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获取好友列表,建立其ID数组,然后在上方调用您的magic函数:
- (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]
配置单元关于ios - 解析iOS SDK:无法从数组中获取对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24024812/