【问题标题】:Perform action after findObjectsInBackgroundWithBlock completed in for loop在 for 循环中完成 findObjectsInBackgroundWithBlock 后执行操作
【发布时间】:2014-07-28 16:39:26
【问题描述】:

我的代码中有这样的结构:

for (METMeetingEntity *e in self.meetingList) {
            PFQuery *query = [PFUser query];        
            //some query constraints, depending on METMeetingEntity
            [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error)
            {
                // some query actions


                NSArray *sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"date" ascending:YES]];
                self.meetingList = [NSMutableArray arrayWithArray:[self.meetingList sortedArrayUsingDescriptors:sortDescriptors]];
                self.meetingList = [self dateCleanup:self.meetingList];
            }];

如何执行操作 - 在所有 findObjectsInBackground 完成后重新加载我的表格视图

【问题讨论】:

  • 这段代码看起来很奇怪。你迭代一些原始的meetingList 数组。对于该原始数组的每次迭代,您都会创建一个新数组并将其分配给相同的属性。只有最后一次迭代才会有用。
  • 错过了您的评论。这看起来很奇怪,因为所有排序操作都应该在 dispatch_async 块中被激发

标签: ios cocoa-touch concurrency parse-platform


【解决方案1】:

一种可能的解决方案是保持计数。当数字与原始计数匹配时,您就知道您已经完成了。

NSUInteger count = self.meetingList.count;
for (METMeetingEntity *e in self.meetingList) {
    PFQuery *query = [PFUser query];        
    //some query constraints, depending on METMeetingEntity
    [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
        // some query actions
        NSArray *sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"date" ascending:YES]];
        self.meetingList = [NSMutableArray arrayWithArray:[self.meetingList sortedArrayUsingDescriptors:sortDescriptors]];
        self.meetingList = [self dateCleanup:self.meetingList];

        count--;
        if (count == 0) {
            dispatch_async(dispatch_get_main_queue(), ^{
                // reload table or whatever needs to be done
            });
        }
    }];
}

【讨论】:

  • 是的,我成功了。我最初在考虑 dispatch_async 的事情。
【解决方案2】:

我认为你不需要调用 dispatch_async。 Parse 中的所有块都在主线程中运行。在 Parse 文档中,您可以阅读:

findObjectsInBackgroundWithBlock: 和 findObjectsInBackgroundWithTarget:selector: 工作类似 他们确保网络请求在没有阻塞的情况下完成,并运行 主线程中的阻塞/回调。

这是一个 UICollectionView 查询示例:

[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
        if(!error) {
            listaFiguras = [objects mutableCopy];
            [_collectionView reloadData];
        } else {
            NSLog(@"Something wrong. No Data.");
        }
    }];

【讨论】:

    猜你喜欢
    • 2023-04-11
    • 1970-01-01
    • 2015-03-04
    • 1970-01-01
    • 2015-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多