现在的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()
获得主线程。