iOS 使用GCD多线程技术来处理耗时任务

时间:2021-10-20 18:30:27

现在的iOS是默认支持多线程的,有些操作比较耗时,但这些耗时的线程不能阻塞主线程。因此需要在实现时,注意确保主线程的顺畅,及时响应用户的交互。

1. 处理耗时的逻辑操作

比如进行图像的压缩和裁剪等耗CPU或GPU的操作时,可以将这些操作放在全局队列中异步执行:

dispatch_async(dispatch_get_global_queue(0, 0), ^{
       //complex logic operation 
});

函数原型为:

dispatch_async(dispatch_queue_t queue, dispatch_block_t block);

async表明异步运行,block代表的是block操作任务,queue则是任务所处队列.

2. 处理耗时的UI操作

2.1 网络操作
有些需要与网络交互的操作,在网络返回前需要显示一个loading的菊花,然后等待网络返回,这时可以使用回调来处理。
比如:处理中的过程,定义为onProgressCallback回调,这个过程显示loading的tip窗口,禁止用户交互;
处理完成,定义为completeCallback(错误或成功),隐藏tip,并给出提示,开启用户交互。
2.2 等待前面UI操作
另外,有时需要等待前面的UI操作完成,比如等待自动隐藏的提示tip 窗口关闭,再进行下一个UI操作,可以使用:

// wait for 1.2 seconds
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, NSEC_PER_SEC * 1.2), dispatch_get_main_queue(), ^{
    // show statusbar
    [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone];
});

的方法来进行。

dispatch_after();

方法表示延迟执行。

DISPATCH_TIME_NOW
//Indicates a time that occurs immediately.

表示当前时间:

dispatch_get_main_queue()

获得主线程。