目录
GCD(Grand Central Dispatch)的常用方法分析和使用
RunLoop
缓存新闻数据和已读状态
·使用NSKeyedArchiver保存列表数据
加载本地数据->网络请求成功后替换
·使用NSUserDefault保存已读状态
已读过的新闻,列表显示不同颜色
·实际项目中的使用
结合项目架构,选择存储方式
数据库/KV/系统级
// 缓读取本地数据
-(NSArray<GSCListItem *> *)_readDataFromLocal{
NSArray *pathArray = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *cachePath = [pathArray firstObject];
NSString *listDataPath = [cachePath stringByAppendingPathComponent:@"GSCData/list"]; // 创建文件
NSFileManager *fileManager = [NSFileManager defaultManager];
NSData *readListData = [fileManager contentsAtPath:listDataPath];
id unarchiveObj = [NSKeyedUnarchiver unarchivedObjectOfClasses: [NSSet setWithObjects:[NSArray class], [GSCListItem class], nil] fromData: readListData error:nil];
if([unarchiveObj isKindOfClass:[NSArray class]] && [unarchiveObj count] > 0){
return (NSArray<GSCListItem *> *)unarchiveObj;
}
return nil;
}
- (void)loadListDataWithFinishBlock:(GSCListLoaderFinishBlock)finishBlock {
NSArray<GSCListItem *> *listData = [self _readDataFromLocal];
if(listData){
finishBlock(YES, listData);
}
}
优化网络和存储流程
·实际项目中,阅读记录不建议存储在NSUserDefault中
·网络和存储的结合
1.使用缓存数据防止重复请求
2.使用缓存数据占位优化体验
IOS中线程基础知识
·IOS中的进程&线程
·通常一个App就是一个进程
·IOS开发中较少的运用进程间通信(XPC),绝大部分使用线程
·IOS中的主线程/非主线程
·保证流畅体验及线程安全,所有UI操作都集中到的一个线程
·影响UI体验(较长时间的操作)尽量放到非主线程
·同步&异步
·IOS中的多线程相关内容
·NSThread/GCD/NSOperation/RunLoop...
NSThread
·pthread的封装
·创建新的线程
·执行之后自动销毁
·每次都要创建
·手动进行线程同步
·手动管理线程的生命周期
GCD(Grand Central Dispatch)的常用方法分析和使用
·高性能的多线程解决方案,自动利用CPU
·线程池模式,自动分配/调度线程,管理线程的生命周期
·通过队列管理多任务,FIFO
·对开发者使用队列代替线程的创建(加入到合适的线程 ——> 加入到合适的队列)
GCD中的队列
·主线程对应主队列
·非主线程按照优先级分为4个队列
·High/Default/Low/Background
·自定义队列
·DISPATCH_QUEUE_SERIAL
·DISPATCH_QUEUE_CONCURRENT
GCD的使用
·使用GCD处理多线程业务逻辑
·选择合适的队列,添加业务逻辑block
·在队列中同步/异步/延迟执行业务逻辑
·注意循环引用
dispatch_async(dispatch_queue_t queue, dispatch_block_t block);
dispatch_async(dispatch_queue_t queue, DISPATCH_NOESCAPE dispatch_block_t block);
dispatch_after(dispatch_time_t when, dispatch_queue_t queue, dispatch_block_t block);
// 非主线程实现加载图片
dispatch_queue_global_t downloadQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_queue_main_t mainQueue = dispatch_get_main_queue();
dispatch_async(downloadQueue, ^{
UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:listItem.picUrl]]];
dispatch_async(mainQueue, ^{
self.rightImageView.image = image;
});
});
GCD常用函数:
dispatch_once //只运行一次,用于单例的创建
dispatch_source //事件源,自定义的触发和监听
dispatch_group //管理一组GCD block
dispatch_semaphore //信号量,用于线程间同步
dispatch_barrier_async //并发队列中的同步点
NSOperation
·GCD缺少可定制性和复杂的依赖
·面向对象的封装NSOperation
·提供任务之间的依赖关系
·支持取消暂停任务,优先级的设置
·子类继承实现,符合业务逻辑的定制
·队列支持最大并发数设置等
·NSOperationQueue(GCD中的队列)
·NSOperation(GCD block中的任务)
NSOperationQueue *queue = [[NSOperation alloc] init]; //对Queue做自定义设置
NSBlockOperation *operation = [[NSBlockOperation alloc] init];
[operation addExecutionBlock:^{
// 任务代码
}];
// 添加operation
[queue addOperation:operation];
// 取消全部operation
[queue cancelAllOperation];
RunLoop
·RunLoop伴随线程对任务处理循环
·RunLoop和线程一一对应
·Model&状态监听
·RunLoop的应用
·NSTimer
·performselector
......
标签:queue,GCD,队列,IOS,dispatch,学习,线程,日记,block From: https://blog.csdn.net/gsc711/article/details/139258789