如何延迟执行一个协议的委托方法,直到另一个协议的委托方法完成执行?

时间:2014-12-12 09:08:50

标签: ios objective-c delegates block

在.m文件ClassroomCollectionViewController中,我声明了以下实例变量:

@implementation ClassroomCollectionViewController
{
    NSMutableArray *students;
}

此数组填充在NSURLConnectionDataDelegate协议的以下委托方法中,ClassroomCollectionViewController实现该方法。

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    if (connection == _getStudentsEnrolledInClassConnection)
    {
        // Parse the JSON that came in
        NSError *error;
        NSArray *jsonArray = [NSJSONSerialization JSONObjectWithData:_receivedData options:NSJSONReadingAllowFragments error:&error];

        if (jsonArray.count > 0)
        {
            students = [[NSMutableArray alloc] init];

            // Populate the students array
            for (int i = 0; i < jsonArray.count; i++)
            {
                Student *studentInClass = [Student new];

                studentInClass.name = jsonArray[i][@"name"];
                studentInClass.profile = jsonArray[i][@"profile"];
                studentInClass.profileImageName = jsonArray[i][@"profile_image_name"];

                [students addObject:studentInClass];
            }
        }
    }
}

在下面的另一个协议的委托方法,即UICollectionViewDelegate中,上面填充的学生数组用于构建集合视图的各个单元格。

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    ClassmateCollectionViewCell *myCell = [collectionView
       dequeueReusableCellWithReuseIdentifier:@"ClassmateCell"
       forIndexPath:indexPath];

    UIImage *image;
    long row = [indexPath row];

    image = [UIImage imageNamed:[students[row] profileImageName]];

    myCell.imageView.image = image;
    myCell.classmateNameLabel.text = [students[row] name];

    return myCell;
}

问题是学生数组尚未在上面两个委托方法中的第二个执行时填充,这导致集合视图中的单元格没有数据要显示。

这个问题的明显解决方案是延迟执行第二个方法,直到第一个方法完成执行(从而确保学生数组将在构建集合视图中的单元格时填充)。但是我无法为我的生活找到如何在这个特定的上下文中做到这一点 - 因为我无法控制何时调用第二个委托方法。我已经考虑过使用块和多线程来解决这个问题,但未能提出与此特定问题相关的解决方案。

有人能指出我正确的方向吗?

非常感谢, 杰

3 个答案:

答案 0 :(得分:1)

试试这个,将IBOutletcollection view

联系起来 您的connectionDidFinishLoading:方法

中的

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {

   //All other codes for populating `students` array

   [self.collectionView reloadData];
}

答案 1 :(得分:0)

要延迟执行集合视图,您需要等到connectionDidFinishLoading调用。

非常简单,你可以从connectionDidFinishLoading方法重新加载集合视图。

多数民众赞成。

答案 2 :(得分:0)

这是设计问题。它假设像这样(MVC模式):

  1. 某些服务正在通过NSURLConnectionDataDelegate将结果发送到模型来接收数据。
  2. 模型强制执行主线程,更新其数据并发布一些通知
  3. 视图控制器已注册模型通知,并对这些通知做出适当的反应。与[self.collectionView reloadData];[self.collectionView insertItemsAtIndexPaths: indexPaths];等相同。