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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM