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 {}