首页 > 其他分享 >IOS开发学习日记(十)

IOS开发学习日记(十)

时间:2024-05-28 18:29:19浏览次数:19  
标签:queue GCD 队列 IOS dispatch 学习 线程 日记 block

目录

缓存新闻数据和已读状态

优化网络和存储流程

 IOS中线程基础知识

NSThread

GCD(Grand Central Dispatch)的常用方法分析和使用

 GCD中的队列

GCD的使用

NSOperation

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

相关文章

  • 学习方法--NLP入门
    1.了解NLP的最基本知识        Jurafsky和Martin的SpeechandLanguageProcessing是领域内的经典教材,对于NLP任务有基本认识,遇到问题知道在书的哪个地方还是非常有意义的。去做一个语言模型的问题,实现神经网络模型之前,第一步要去写一个bigram或者trigram的语言模......
  • 初中生学习掌握这几点,有助于你提高学习成绩,家长也需要了解
    初中是奠定基础的阶段,一旦形成好的学习习惯,不仅整个初中孩子的学习都非常高效,而且到了高中,这些良好的习惯也会约束自己,这对于孩子培养自主学习能力都是很有帮助的,那么初中生需要具备哪些学习习惯呢?具体我做了总结,希望对大家有所帮助!一、做好学习计划的习惯学习一......
  • Jenkins学习(三)--Secret
    一、JenkinsSecret的操作方法①启动Jenkins后进入仪表板中的系统管理,选择凭据管理②点击已经可用的全球商店,单击全局凭据,然后单击添加凭据。③类型选择为Secret,范围选择全局,在Secret处粘贴从postman处复制的api密钥(不知道密钥怎么获取可以参考前面的Jenkins文章),id自定......
  • 阿赵UE引擎C++编程学习笔记——文件夹操作和文件读写
      大家好,我是阿赵。  这次学习一下在UE里面使用C++的API操作文件读写和文件夹操作。一、UE引擎获取相关路径  获取到路径一般是相对路径,使用FPaths::ConvertRelativePathToFull转换后,可以获得完整的绝对路径。FStringcontentDir=FPaths::ProjectContentDir();......
  • 前端菜鸡流水账日记 -- threejs和cesium
    哈喽哇大家,今天来点不一样的,主要是因为今天没有后台系统的修改,所作的修改是在以cesium为基础的项目上,用threejs渲染一个模型,并且可以具有显示/隐藏的功能,那下边就让我们来看看怎么实现的把~--------------------------------------------------------------------------------......
  • Day19学习Java
    什么是注解java.annotation包Annotation是从JDK1.5开始引入的新技术,注解即可以对程序员解释又可以对程序解释注解与注释的区别注释:对程序员解释代码信息注解:对程序和程序员解释代码信息注解的所用不是程序本身,可以对程序作出解释(与注释(comment)类似)可以被其他程序......
  • C语言学习——break语句,continue语句,signed与unsigned,再论数据类型
    目录一、break语句二、continue语句 三、signed与unsigned1.当程序运行时,如果发生了越界:2.有符号与无符号 四、再论数据类型1.C语言中的sizeof关键字2.C语言中的奇葩整型(long)3.数据类型的本质区别一、break语句1、break语句可以结束当前循环的执行2、执行完brea......
  • 基于SpringBoot+Vue+uniapp的互助学习的详细设计和实现(源码+lw+部署文档+讲解等)
    文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我代码参考数据库参考源码获取前言......
  • Python学习笔记-文件操作与CSV格式
    文件打开和关闭程序中的数据都存储在内存中,当程序执行完毕后,内存中的数据将丢失。文件可以用来进行数据的长期保存。open函数打开一个要做读/写操作的文件,打开文件后会返回一个文件对象,利用该文件对象可完成数据的读写操作。其常用形式为:open(filename,mode='r')#file......
  • 渗透学习指南1
    渗透学习指南一、新手篇一、了解渗透测试基础知识1.渗透测试的定义与目的1.定义:渗透测试是一种通过模拟恶意攻击者的行为来评估计算机系统、网络或Web应用的安全性的方法。2.目的:发现系统或应用中的安全漏洞,评估漏洞被利用的可能性,并提供修复建议以增强安全性。2.渗透测......