我创建了一个 UItableView,每个表格单元格都是一个 UICollectionView。我的视图控制器是 UITableView 和 UICollectionView 的委托和数据源。
tableView 的行数取决于填充数组的异步请求。表格单元内的 UICollectionView 内的单元格数量也是异步确定的。
所以基本上,每次我添加到驱动 tableview 中行数的数组时 - 我都在调用 [tableView reloadData];
这反过来又会触发重新加载每个单元格。在每个单元格中,我将 UICollectionView 的委托设置为控制器,并调用 [UICollectionView reloadData] 来刷新 UICollectionView。UICollectionView 中的单元格正在下载也发生异步的图像。
我的问题是有什么更优雅的方法来做到这一点?
我的代码如下
- (void)viewDidLoad
{
[self.featuresTableView setDelegate:self];
[self.featuresTableView setDataSource:self];
}
我的 viewController 是通过调用许多异步请求创建的对象的观察者。所以我在对象上设置了一个 KVO
-(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
if([keyPath isEqualToString:@"completedSpotSetup"]){
CustomClass * customObject = ((CustomClass*) object);
if(customObject.isValidPropertySet){
NSString *fcode = [customObject.dictionary objectForKey:@"code"];
NSMutableArray * myArray = [self.myTableRowArrayDictionary objectForKey:fcode];
if (myArray == nil) {
featureArray = [[NSMutableArray alloc] init];
[self.myTableRowArrayDictionary setObject:featureArray forKey:fcode];
[self.myTableView reloadData];
}
[myArray addObject:customObject];
}
}
接下来在我的
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return [[[self.myTableRowArrayDictionary keyEnumerator] allObjects] count];
}
And in the datasource for cell
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *cellIdentifier = @"featureCell";
FeatureTableRowCell *cell = (FeatureTableRowCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];
if (cell.tableCellCollectionView.delegate == nil ) {
[cell.tableCellCollectionView setDelegate:self];
[cell.tableCellCollectionView setDataSource:self];
cell.tableCellCollectionView.tag = indexPath.row;
}
[cell.tableCellCollectionView reloadData];
return cell;
}
The controller further implements the UICollectionView datasource to determine the number of cells and data for each cell as follows
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{
NSString * fcode = [self.interestsToSearch objectAtIndex:collectionView.tag];
NSArray * myArray = [self.myTableRowArrayDictionary objectForKey:fcode];
return [myArray count];
}
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
NSString * fcode = [self.interestsToSearch objectAtIndex:collectionView.tag];
NSArray * myArray = [self.myTableRowArrayDictionary objectForKey:fcode];
static NSString *cellIdentifier = @"collectionCell";
UICollectionViewCell *cell = (UICollectionViewCell *)[collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath];
dispatch_queue_t loaderQ = dispatch_queue_create("flickrImageLoader", NULL);
dispatch_async(loaderQ,^{
// Do Something
});
return cell;
}
这样做会导致 VREY 性能不佳并且效果不佳。
我错过了什么?我认为将一个水平滚动的 UICollectionView 放在 tableview 内是合法的。如果我不知道当我开始显示表格时 UITableView 将有多少行以及 UICollectionView 将有多少个单元格,那么最好的方法是什么。当互联网请求得到解决时,所有这些都是异步确定的。
任何人都可以对这样一个长问题有耐心并帮助我吗???