并发迭代NSArray

时间:2016-08-06 07:50:24

标签: ios objective-c concurrency queue

我有array个用户对象。我需要迭代这个数组,然后,对于每个用户,我需要根据用户ID提出获取数据的请求。此请求是异步请求(由于我无法使其同步)。以下是使用dispatch_group调用编辑的代码:

EDITED

for (User *user in self.userList) {
    dispatch_group_enter(self.usersGroup);
    [self.wrapper getUserDataWithId:user.userid completion:^(Owner *owner, NSError *error) {
        user.owner = owner;
        dispatch_group_leave(self.usersGroup);
    }];
}

dispatch_group_notify(self.usersGroup, dispatch_get_main_queue(), ^{
   // All requests have finished
   // Stuff with updated userlist
});

主要问题很明显:当第一个请求完成时,它所引用的用户引用不是已启动请求的那个,因此我没有正确的关联。

有没有简单而优雅的方法来解决这个问题?提前谢谢!

1 个答案:

答案 0 :(得分:0)

由于@ Paulw11建议循环不会等你执行该块,所以我建议你使用这样的递归函数而不是for循环。

- (void)getOwnerForObectAtIndex:(NSInteger)index {
    if (index < self.userList) {
        User *user = [self.userList objectAtIndex:index];
        [self.wrapper getUserDataWithId:user.userid completion:^(Owner *owner, NSError *error) {
            user.owner = owner;
            [self getOwnerForObectAtIndex:index+1];
        }];
    }
    else {
        //Now all User have its corresponding owner, Handle array Now. 
    }
}

现在调用此函数,如[self getOwnerForObectAtIndex:0];