zoukankan      html  css  js  c++  java
  • iOS开发创建UI的耗时操作处理

    项目中有网络请求、读写操作等一系列耗时操作时,为了避免阻塞主线程,我们会把这些耗时操作放到子线程中去处理,当处理完成后,再回到主线程更新UI,这样就不会阻塞主线程。但是创建UI的时候一般都是在主线程中执行,如果需要创建的UI控件比较多的时候,可能会发生很不友好的卡顿现象,体验很差,比如当push到某一个ViewController中,由于项目需求,该ViewController中创建了比较多的view及view子类,页面在跳转的时候,会发生很不友好的卡顿现象。
    这时候比较简单的方法就是直接使用。

    [self performSelector:(nonnull SEL) withObject:(nullable id) afterDelay:(NSTimeInterval) inModes:(nonnull NSArray<NSString *> *)];

    这个方法共有四个参数,第一个参数可以理解为要调用的方法名字;第二个参数表示要调用的方法所携带的参数(若无参,传nil即可);第三个参数表示延迟多少秒执行(若不要延迟执行传0.0即可);最后一个参数是一个数组,数组中的元素为RunLoop的mode(NSDefaultRunLoopMode和NSRunLoopCommonModes)。

    - (void)viewDidLoad {
        [super viewDidLoad];
        [self performSelector:@selector(setupUI) withObject:nil afterDelay:0.0f inModes:@[NSRunLoopCommonModes]];
    }
    //这段代码是在当前线程中使用给定的具体的Runloop mode来执行并不一定是在主线程中执行。如果想要确保在主线程中执行, 可以使用
    //performSelectorOnMainThread:withObject:waitUntilDone:或者
    //performSelectorOnMainThread:withObject:waitUntilDone:modes:来代替
    - (void)setupUI {
        //阻塞主线程的UI操作可放到这里执行
        for (int i=0; i<10000; i++) {
            UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, i*2+10, 5, 5)];
            view.backgroundColor = [UIColor redColor];
            [self.view addSubview:view];
            NSLog(@"耗时UI操作");
            NSLog(@"%@", view);
        }
    }

    转自:http://www.jianshu.com/p/82c98bf6ef81

  • 相关阅读:
    bzoj4518[Sdoi2016]征途 斜率优化dp
    bzoj3675[Apio2014]序列分割 斜率优化dp
    bzoj3437小P的牧场 斜率优化dp
    bzoj3156防御准备 斜率优化dp
    bzoj1911[Apio2010]特别行动队 斜率优化dp
    bzoj5100 [POI2018]Plan metra 构造
    bzoj1597[Usaco2008 Mar]土地购买 斜率优化dp
    刷题总结——Middle number(ssoj 优先队列)
    刷题总结——doing homework again(hdu1789)
    NOIP2017赛前模拟(3):总结
  • 原文地址:https://www.cnblogs.com/jukaiit/p/6708406.html
Copyright © 2011-2022 走看看