gpt4 book ai didi

ios - 如何延迟一个协议(protocol)的委托(delegate)方法的执行,直到另一个协议(protocol)的委托(delegate)方法完成执行?

转载 作者:行者123 更新时间:2023-11-29 02:26:41 25 4
gpt4 key购买 nike

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

@implementation ClassroomCollectionViewController
{
NSMutableArray *students;
}

此数组在 ClassroomCollectionViewController 实现的 NSURLConnectionDataDelegate 协议(protocol)的以下委托(delegate)方法中填充。

- (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];
}
}
}
}

在另一个协议(protocol)的以下委托(delegate)方法中,即 UICollectionViewDelegate,上面填充的学生数组用于构造 Collection View 的各个单元格。

- (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;
}

问题是,当上面两个委托(delegate)方法中的第二个方法执行时,students 数组还没有填充,这导致 Collection View 中的单元格没有数据可以显示。

这个问题的明显解决方案是延迟第二个方法的执行,直到第一个方法完成执行(从而确保在构建 Collection View 中的单元格时填充学生数组)。但是我终其一生都无法弄清楚如何在这个特定的上下文中做到这一点——因为我无法控制何时调用第二个委托(delegate)方法。我考虑过使用 block 和多线程来解决这个问题,但未能提出与这个特定问题相关的解决方案。

谁能指出我正确的方向?

非常感谢,周杰伦

最佳答案

尝试一下,将 IBOutlet 连接到 Collection View

在您的connectionDidFinishLoading:方法中

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

//All other codes for populating `students` array

[self.collectionView reloadData];
}

关于ios - 如何延迟一个协议(protocol)的委托(delegate)方法的执行,直到另一个协议(protocol)的委托(delegate)方法完成执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27440192/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com