这是我的第一个问题,请原谅我是新手。
我正在使用CollectionView来显示从互联网下载的图像。当我尝试异步执行时会出现问题。
@interface myViewController
{
NSArray *ArrayOfSections
}
@end
-(void)viewDidLoad{
[self performSelectorInBackground:@selector(refreshImages) withObject:nil];
}
-(void)refreshImages{
... //Get information from the net
NSArray internetInfo = ...;
[self performSelectorOnMainThread:@selector(refreshCollectionView:) withObject:internetInfo waitUntilDone:NO];
}
-(void)refreshCollectionView:(NSArray tempArray){
ArrayOfSections = tempArray;
}
此代码无效。它显示了一个空的CollectionView,虽然我已经仔细检查了存储在ArrayOfSections上的信息是否正确。
此外,如果我同步执行(我只更改viewDidLoad)。
-(void)viewDidLoad{
[self refreshImage];
}
一切正常。我要去香蕉。请帮忙
答案 0 :(得分:0)
我认为这是因为你没有告诉集合视图重新加载。您的刷新方法更新模型但不更新视图。
如果你在后台线程上获取数据,主线程可以继续它的生命周期,这包括查询集合视图数据源和委托方法然后更新视图,但是在你的情况下它会很快这样做,因为模型尚未准备好。这就是为什么你需要告诉它在模型准备就绪时,在数据获取结束时再次这样做。由于您在同步执行时阻塞了线程,因此在模型准备就绪之前它不会到达集合视图方法,这就是它以这种方式工作的原因。