iOS開發建立UI的耗時操作處理,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); }}