我创建了一个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 BAD表现不佳并且效果不佳。
我错过了什么?我认为放置一个在tableview中水平滚动的UICollectionView是合法的。如果我不知道UITableView将拥有多少行以及当我开始显示表时UICollectionView将具有多少单元格,那么最好的方法是什么?当互联网请求得到解决时,所有这些都是异步确定的。
任何人都可以对这样一个长期的问题有一些耐心并帮助我吗???