美文网首页
用RunLoop对UICollectionView优化

用RunLoop对UICollectionView优化

作者: 今年27 | 来源:发表于2018-10-20 10:35 被阅读45次

遇到一个bug, 就是有很多很多图片, 比如5000以上的图片用collectionView去展示的时候, 飞快的滑动会卡死整个界面, 进而卡死整个应用.
我查了一下内存, 47m不多, 不太可能因为内存而卡死.
不知道是什么问题,我估计是collectionview内部对这种数据展示有问题吧
所以优化一下
1, 对runloop进行观察, 并进行事件优化

typedef void(^RunLoopBlock)(void);

-(void)addTask:(RunLoopBlock)block{
    [_showTask addObject:block];
    if (_showTask.count > _taskCount) {
        [_showTask removeObjectAtIndex:0];
    }
}

-(void)addRunLoopObserver{
    CFRunLoopRef runloop = CFRunLoopGetCurrent();
    CFRunLoopObserverContext context = {
        0,
        (__bridge void *)self,
        &CFRetain,
        &CFRelease,
       NULL
    };
    static CFRunLoopObserverRef defaultModeObserver;
    defaultModeObserver = CFRunLoopObserverCreate(NULL, kCFRunLoopBeforeWaiting, YES, 0, &RunLoopCallBack, &context);
    CFRunLoopAddObserver(runloop, defaultModeObserver, kCFRunLoopCommonModes);
    CFRelease(defaultModeObserver);
  
}

static void RunLoopCallBack(CFRunLoopObserverRef observer, CFRunLoopActivity activity, void *info){
    SSChoosePhotoViewController* vc = (__bridge SSChoosePhotoViewController*)info;
    if (vc.showTask.count == 0) {
        return;
    }
    RunLoopBlock task = vc.showTask.firstObject;
    task();
    [vc.showTask removeObjectAtIndex:0];
}

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
    SSChoosePhotoCollectionViewCell* cell = [collectionView dequeueReusableCellWithReuseIdentifier:NSStringFromClass([SSChoosePhotoCollectionViewCell class]) forIndexPath:indexPath];
    
   
    JSDateModel* dateModel = self.itemsArray[indexPath.section];

    JSImageModel *model = [dateModel.imageArray objectAtIndex:indexPath.row];
    if ([_uploadArray containsObject:model]) {
        cell.choosed = YES;
    }else{
        cell.choosed = NO;
    }
    if ([model.photoName hasSuffix:@".mp4"]) {
        cell.isVideo = YES;
    }else{
        cell.isVideo = NO;
    }

    __weak typeof(self) weak_self = self;
    [self addTask:^{
        [weak_self showImage:cell model:model];
    }];
    return cell;
}

其实整个逻辑就是自己去针对整个图片加载逻辑优化,主要是用runloop的触发机制去触发UI渲染事件, 一般情况下, UI事件必须在主线程, 实际上底层就是Runloop, 自己控制任务数量(一般我自己设置为20), 这样在滑动的时候就会顺畅很多,而且不会出现卡死的情况

相关文章

  • 用RunLoop对UICollectionView优化

    遇到一个bug, 就是有很多很多图片, 比如5000以上的图片用collectionView去展示的时候, 飞快的...

  • iOS-runloop相关

    本篇涵盖runloop解释、应用、利用runloop优化程序等. 1.iOS RunLoop漫谈2.RunLoop...

  • Runloop优化列表滑动卡顿

    Runloop优化列表滑动卡顿

  • iOS夯实:RunLoop

    @转 目标:用简洁易懂的语言归纳runLoop和对我们日常开发的影响。 1. 什么是RunLoop runLoop...

  • UICollectionViewCell

    9 UICollectionViewCell的的优化 在iOS 10 之前,UICollectionView上面如...

  • iOS高级进阶之RunLoop

    简介 RunLoop 例 以下并非源码(对源码进行了可读性优化,便于理解) autoreleasepool 解决U...

  • RunLoop 原理和核心机制

    前一短时间负责项目的性能优化,需要利用RunLoop做性能优化和性能检测,趁着这个机会深入研究了RunLoop的原...

  • iOS常规的优化技巧

    原文地址 卡顿优化 添加Observer到主线程RunLoop中,通过监听RunLoop状态切换的耗时,以达到监控...

  • iOS笔记-runloop

    runloop可以做什么? 处理crash 保持线程存活(线程保活) 监测、优化卡顿 线程和runloop有什么关...

  • 优化UITableView、UICollectionView

    上次提到使用Adapter设计模式简化UITableView、UICollectionView 文章(在ios中使...

网友评论

      本文标题:用RunLoop对UICollectionView优化

      本文链接:https://www.haomeiwen.com/subject/dysuzftx.html