我有一个显示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/

10-12 12:28
查看更多