注册 登录
主题 : collectionView这么写有什么问题吗?数据一多就会变卡变慢闪退
级别: 侠客
状态: 连续签到 - [1天]
UID: 280515
精华: 0
发帖: 179
可可豆: 590 CB
威望: 574 点
在线时间: 341(时)
注册时间: 2013-12-10
最后登录: 2018-08-20
0 楼:  发表于: 2018-06-06 16:55    发自: Web Page
来源于 调试问题 分类

collectionView这么写有什么问题吗?数据一多就会变卡变慢闪退   

有1000条数据的时候,整 个app都被卡住了,而且上下滑动的时候,滑到一半以下,就会变卡,再接着就是Message from debugger: Terminated due to memory issue 闪退了


#define kCollectionHeaderIdentifer @"CategoryNameCollectionReusableView"
#define kCollectionCellIdentifer @"OrderSiftCollectionViewCell"


@interface OrderSiftViewController ()<UICollectionViewDelegate,UICollectionViewDataSource>

@end

@implementation OrderSiftViewController
{
    NSMutableDictionary * siftModels;
    NSArray * siftKeys;
    
    NSMutableDictionary * selectSifts;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    selectSifts = [NSMutableDictionary dictionary];
    siftModels = [NSMutableDictionary dictionary];
    UICollectionViewLeftAlignedLayout * leftAlignedLayout = [[UICollectionViewLeftAlignedLayout alloc] init];
    _collectionView.collectionViewLayout = leftAlignedLayout;
    [_collectionView registerNib:[UINib nibWithNibName:NSStringFromClass([OrderSiftCollectionViewCell class]) bundle:nil] forCellWithReuseIdentifier:kCollectionCellIdentifer];
    [_collectionView registerNib:[UINib nibWithNibName:NSStringFromClass([CategoryNameCollectionReusableView class]) bundle:nil] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:kCollectionHeaderIdentifer];
    
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
//    [self.clcView registerNib:[UINib nibWithNibName:@"OrderCategoryCollectionViewCell1" bundle:nil] forCellWithReuseIdentifier:@"OrderCategoryCollectionViewCell1"];


}

- (void)setDataSource:(NSDictionary *)dataSource
{
    _dataSource = dataSource;
    [siftModels removeAllObjects];
    [selectSifts removeAllObjects];

    for (NSString * key in [_dataSource allKeys]) {
        if ([key isEqualToString:@"country"]) {
            if ([[_dataSource objectForKey:@"country"] count]>0) {
                [siftModels setObject:[Country mj_objectArrayWithKeyValuesArray:[_dataSource objectForKey:@"country"] ] forKey:@"国家"];
                [selectSifts setObject:[NSMutableArray array] forKey:key];
            }
        }else if ([key isEqualToString:@"brand"]) {
            if ([[_dataSource objectForKey:@"brand"] count]>0) {
                [siftModels setObject:[Brand mj_objectArrayWithKeyValuesArray:[_dataSource objectForKey:@"brand"] ] forKey:@"品牌"];
                [selectSifts setObject:[NSMutableArray array] forKey:key];
            }
        }else if ([key isEqualToString:@"cat"]) {
            if ([[_dataSource objectForKey:@"cat"] count]>0) {
                [siftModels setObject:[Cat mj_objectArrayWithKeyValuesArray:[_dataSource objectForKey:@"cat"] ] forKey:@"分类"];
                [selectSifts setObject:[NSMutableArray array] forKey:key];
            }
        }
    }
    siftKeys = [siftModels allKeys];
    [_collectionView reloadData];
}
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
{
    return [siftKeys count];
}
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
    
    return [[siftModels objectForKey:[siftKeys objectAtIndex:section]] count];
}
- (__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    
    OrderSiftCollectionViewCell * cell = [collectionView dequeueReusableCellWithReuseIdentifier:kCollectionCellIdentifer forIndexPath:indexPath];
    NSString * key = [siftKeys objectAtIndex:indexPath.section];
    if ([key isEqualToString:@"国家"]) {
        Country * model = [[siftModels objectForKey:key] objectAtIndex:indexPath.row];
        cell.title = [model name];
        [cell setSelected:[model select]];
    }else if ([key isEqualToString:@"品牌"]) {
        Brand * model = [[siftModels objectForKey:key] objectAtIndex:indexPath.row];
        cell.title = [[[siftModels objectForKey:key] objectAtIndex:indexPath.row] brand_name];
        [cell setSelected:[model select]];
    }else if ([key isEqualToString:@"分类"]) {
        Cat * model = [[siftModels objectForKey:key] objectAtIndex:indexPath.row];
        cell.title = [[[siftModels objectForKey:key] objectAtIndex:indexPath.row] cat_name];
        [cell setSelected:[model select]];
    }
    return cell;
}

-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
    NSString * content ;
    NSString * key = [siftKeys objectAtIndex:indexPath.section];
    if ([key isEqualToString:@"国家"]) {
        content = [[[siftModels objectForKey:key] objectAtIndex:indexPath.row] name];
    }else if ([key isEqualToString:@"品牌"]) {
        content = [[[siftModels objectForKey:key] objectAtIndex:indexPath.row] brand_name];
    }else if ([key isEqualToString:@"分类"]) {
        content = [[[siftModels objectForKey:key] objectAtIndex:indexPath.row] cat_name];
    }
    CGFloat width = [Util calculateSingleStringSizeWithString:content andFont:ANNA_FONT(13)].width + TRUE_NavigationScale(26);
    return CGSizeMake(width, TRUE_NavigationScale(30));
}
-(UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section
{
    return UIEdgeInsetsMake(0, 0, 20, 20);//分别为上、左、下、右
}
#pragma mark 有关头脚视图
-(UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath
{
    CategoryNameCollectionReusableView * name = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"CategoryNameCollectionReusableView" forIndexPath:indexPath];
    [name setname:[siftKeys objectAtIndex:indexPath.section]];
    return name;
}

-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section
{
     return CGSizeMake(collectionView.width, TRUE_NavigationScale(35));
}
级别: 侠客
状态: 连续签到 - [1天]
UID: 280515
精华: 0
发帖: 179
可可豆: 590 CB
威望: 574 点
在线时间: 341(时)
注册时间: 2013-12-10
最后登录: 2018-08-20
1 楼:  发表于: 2018-06-06 17:03    发自: Web Page
计算cell size的方法会阻塞主线程,把这个方法固定返回一个size后,上下滑动,app还是会因为内存的问题而终止
级别: 新手上路
UID: 650719
精华: 0
发帖: 2
可可豆: -3 CB
威望: -3 点
在线时间: 1(时)
注册时间: 2018-06-05
最后登录: 2018-06-08
2 楼:  发表于: 2018-06-06 18:17    发自: Web Page
回 楼主(haiyan2081) 的帖子
的符号刚回家看
级别: 骑士
状态: 连续签到 - [80天]
UID: 574329
精华: 0
发帖: 404
可可豆: 940 CB
威望: 807 点
在线时间: 820(时)
注册时间: 2016-07-21
最后登录: 2018-08-20
3 楼:  发表于: 2018-06-06 23:18    发自: Web Page
这真的是13年的老司机么 。。。
级别: 侠客
状态: 连续签到 - [1天]
UID: 280515
精华: 0
发帖: 179
可可豆: 590 CB
威望: 574 点
在线时间: 341(时)
注册时间: 2013-12-10
最后登录: 2018-08-20
4 楼:  发表于: 2018-06-07 09:46    发自: Web Page
回 3楼(马阿剑) 的帖子
请16年的司机 赐教
级别: 圣骑士
UID: 566785
精华: 0
发帖: 675
可可豆: 702 CB
威望: 702 点
在线时间: 678(时)
注册时间: 2016-06-03
最后登录: 2018-06-13
5 楼:  发表于: 2018-06-07 10:47    发自: Web Page
有没有demo啊。。。这段看起来不会卡的
除非cell size那里计算的很慢,或者你反复调用那个setDatasourece方法
级别: 侠客
状态: 连续签到 - [1天]
UID: 280515
精华: 0
发帖: 179
可可豆: 590 CB
威望: 574 点
在线时间: 341(时)
注册时间: 2013-12-10
最后登录: 2018-08-20
6 楼:  发表于: 2018-06-11 13:40    发自: Web Page
回 5楼(aitazzd) 的帖子
我把它单拿出来放到demo里,一点都不卡
级别: 骑士
状态: 连续签到 - [1天]
UID: 405796
精华: 0
发帖: 265
可可豆: 369 CB
威望: 359 点
在线时间: 329(时)
注册时间: 2014-11-24
最后登录: 2018-08-20
7 楼:  发表于: 2018-06-11 17:08    发自: Web Page
看来卡的地方和这段代码的关系不大,老司机
级别: 侠客
状态: 连续签到 - [1天]
UID: 280515
精华: 0
发帖: 179
可可豆: 590 CB
威望: 574 点
在线时间: 341(时)
注册时间: 2013-12-10
最后登录: 2018-08-20
8 楼:  发表于: 2018-06-12 15:56    发自: Web Page
回 7楼(陌上红尘) 的帖子
老司机栽沟里了,
级别: 新手上路
UID: 524502
精华: 0
发帖: 22
可可豆: 40 CB
威望: 40 点
在线时间: 272(时)
注册时间: 2015-11-18
最后登录: 2018-08-21
9 楼:  发表于: 2018-06-13 10:08    发自: Web Page
看你cell上放什么东西了,曾经尝试过放UIVisualEffectView, 渲染代价真的高,20fps,
描述
快速回复

关注本帖(如果有新回复会站内信通知您)

发帖、回帖都会得到可观的积分奖励。查看论坛积分规则

按"Ctrl+Enter"直接提交
    顶部