在.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;
}
问题是学生数组尚未在上面两个委托方法中的第二个执行时填充,这导致集合视图中的单元格没有数据要显示。
这个问题的明显解决方案是延迟执行第二个方法,直到第一个方法完成执行(从而确保学生数组将在构建集合视图中的单元格时填充)。但是我无法为我的生活找到如何在这个特定的上下文中做到这一点 - 因为我无法控制何时调用第二个委托方法。我已经考虑过使用块和多线程来解决这个问题,但未能提出与此特定问题相关的解决方案。
有人能指出我正确的方向吗?
非常感谢, 杰
答案 0 :(得分:1)
试试这个,将IBOutlet
与collection view
和
connectionDidFinishLoading:
方法中的
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
//All other codes for populating `students` array
[self.collectionView reloadData];
}
答案 1 :(得分:0)
要延迟执行集合视图,您需要等到connectionDidFinishLoading调用。
非常简单,你可以从connectionDidFinishLoading方法重新加载集合视图。
多数民众赞成。
答案 2 :(得分:0)
这是设计问题。它假设像这样(MVC模式):
NSURLConnectionDataDelegate
将结果发送到模型来接收数据。[self.collectionView reloadData];
或[self.collectionView insertItemsAtIndexPaths: indexPaths];
等相同。