runloop
主线程 的 Runloop对象 会自动开启, UIApplication开启了一个死循环(消息循环)
每一个线程都有自己的 runloop 对象
runloop 1.> 输入源 input resource: (异步消息->处理其他线程)处理处理其他线程回到主线程做事情
performSelector: onThread (线程之间通信)
2.> 定时源 timer resource :(同步消息->处理主线程) 处理主线程的UI界面刷新,事件处理,定时器(定时解决界面上有没有UI刷新,滚动)
开子线程特别耗费内存资源,所以需要对线程进行精准的管理
1. 检查网络请求是否放在了主线程中
2. 看看异步请求的数量是否太多了(子线程数量)
3. 数据量是否太大? 如果太大,先清除一些不必要的对象(看不见的数据, 特别是图片)
及时监听内存警告
- (void) ApplicationDidReceiveMesonry
多线程安全怎么控制?
1. 只在主线程中刷新访问UI
2. 如果要防止资源抢夺, 得用 synchronized 进行加锁保护
3. 如果异步操作要保证线程安全问题, 尽量使用GCD (有些函数默认是线程安全的)
异步线程中下载很多图片,如果失败了,如何处理?
1. 重新下载图片
2. 下载完毕后,利用Runloop 的 输入源回到主线程刷新UIImageView
有些图片加载比较慢怎么处理?
1. 图片下载放在异步线程
2. 图片下载过程中使用占位图片
3. 如果图片过大,可以考虑多线程断点下载 -> 设置请求头信息
SDWebImage具体实现过程
1. 利用NSOperationQueue 和 NSOperation 下载图片
2. 还使用GCD的一些函数来解码GIF图片
gif图片 (gif分解)->imageIO 切除所有帧 (每一帧都是UIImage对象)(这个过程比较耗时,放入异步线程中)
UIImageView * imageView;
imageView.animationImages = ..;
3. 利用URL作为key, NSOperation 作为 value
4. 利用URL作为key, UIImage 作为 value
利用NSNotificationCenter实现跨多控制器传输数据和消息中用异步还是同步?
1. 如果通知是在主线程发出,那么接收通知的方法中的耗时操作要放到异步线程中
[[NSNotificationCenter defaultCenter] postNotificationName: @"abc" object; nil ];
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(test) name: @"abc" object : nil];
- (void) test { dispatch.....}
2. 如果通知实在异步线程中发出,那么接收通知后调用的方法会默认在异步线程中执行
dispatch_async ( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{
[NSNotificationCenter defaultCenter] postNotificationName: @"abc" object; nil ];
});
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(test) name: @"abc" object : nil];
- (void) test {}