1

我创建了一个 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 将有多少个单元格,那么最好的方法是什么。当互联网请求得到解决时,所有这些都是异步确定的。

任何人都可以对这样一个长问题有耐心并帮助我吗???

4

0 回答 0