GeekBand-IOS进阶第三周笔记(多线程、数据持久化)

多线程

NSThread

基本概念

多线程概念.png
  • 信号量:商场储物柜,一把钥匙一把锁;
  • 互斥量:一个指纹锁的保险箱;
  • 临界区:一段加密的代码,一次只能通过一个指令;
  • 读写锁:只读不能写(拿到写锁定的权限才可以写);
  • 条件变量:满足条件的指令都等着,到条件满足时一起执行。

多线程API

多线程API.png

我们现在讨论的主要是NSThread,它是基于OC的接口。


两类线程.png

小区别:主进程退出时不管detached only执行完毕与否都立即结束,joinable by default没有执行完时主进程也不能退出。
Operation系列是对象,代表一个任务;Queue代表调度。
NSOperation+NSOperationQueue;Dispatch Queue更加灵活强大,基于C的。

Main Thread

主线程.png

NSThread.png

开销大的任务在新线程执行:

  • NSThread类方法 +(void)detachNewThreadSelector:(SEL)toTarget:(id)withObject:(id)
  • 自定义NSThread实例
    此方法的作用一般是更新界面,只不过不能直接在view的加载过程更新,得间接调用这个方法来更新。
    回主线程执行,任意一个NSObject对象(self)都可以调用此方法,BOOL值代表是否需要等待当前方法执行完毕才继续往下执行,一般是NO。

线程开销

线程开销.png

线程属性及存储

线程属性及存储.png

线程局部存储:存储在内存上,不和其他线程共享,没有并发访问冲突的问题。

线程控制

线程控制.png

线程一般只有这三个状态,依次是执行、完成、取消。

  • 一般线程最好是执行完再finished,这个调用此方法
    [self performSelectorOnMainThread:<#(nonnull SEL)#> withObject:<#(nullable id)#> waitUntilDone:<#(BOOL)#>]
  • 停止线程:如果实在需要取消也用 -cancel 方法,不要用 +exit ,因为cancel可以给你处理现场的机会,而exit比较粗暴,直接结束,什么都不管。
  • sleep 睡眠,可以指定睡多少秒,也可以指定睡到什么时候。
  • +currentThread 拿到当前线程的实例,以便于做start或cancel等操作。

NSRunLoop

基本概念

NSRunLoop.png
  • RunLoop总的来说就是管理线程的,它把查询事件的任务从线程里分离,在等待事件来之前,把线程设置为sleep,事件发生时唤醒它;
  • 有两种接口:NSRunLoop和CFRunLoopRef。NSRunLoop如果有多个线程同时访问,不安全,CFRunLoopRef则没有这个限制;
  • 得自己创建才有runLoop,主线程除外。

RunLoop Mode

RunLoop Mode.png
  • Mode可以说是一个集合,里面包含了输入事件源(如触摸事件、手势等)、Observer(可以添加代码,获取RunLoop的信息)、定时器;
  • Source:custom source和source1。custom source包含一个回调可以理解为方法,custom source较为被动,source1比较主动。
  • API:currentRunLoop,获取或者创建当前线程的runLoop;
    currentMode,现在runLoop在哪个mode上;
    limitDateForMode,让runLoop不要睡眠、不要在事件源等待转一圈立即返回,返回下一个Timer的时间,格式为NSDate,没有返回nil;
    mainRunLoop,不管在哪儿,都可以拿出当前主线程的runLoop;
    下面几个API顾名思义,不作解释了。

预定义RunLoop Mode

预定义RunLoop Mode.png

Common Modes.png

NSRunLoop生命周期

NSRunLoop生命周期.png

示例

示例API.png

NSoperation

多线程目的

线程目的.png

NSOperation抽象基类

NSOperation抽象基类.png

子类

NSBlockOperation.png

NSInvocationOperation.png

依赖关系.png

NSOperation状态

NSOperation状态.png

GCD

queue.png

自定义只能创建串行queue,为避免系统崩溃,只可以用默认的并行queue。

数据持久化

简单的一些方法

数据持久化.png
  • 简易存储方法
(void)easyload
{
    //主程序目录
    NSString *testpath = [[NSBundle mainBundle]pathForResource:@"test" ofType:@"png"];
    NSLog(@"testpath:%@",testpath);
   //最后一个Documents目录
    NSString *Documentspath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
    NSLog(@"Documents:%@",Documentspath);
    //将图片存到Documents
    NSString *imagepath = [Documentspath stringByAppendingPathComponent:@"imagetest.png"];
    UIImage *imagetest = [UIImage imageNamed:@"test.png"];
    NSData *imagedata = UIImagePNGRepresentation(imagetest);
    [imagedata writeToFile:imagepath atomically:YES];
    //将文本存到Documents
    NSString *testpath01 = [Documentspath stringByAppendingPathComponent:@"test.txt"];
    NSString *teststr = [NSString stringWithFormat:@"test"];
    [teststr writeToFile:testpath01 atomically:YES encoding:NSUTF8StringEncoding error:nil];
    //将数组存到Documents
    NSString *arrayPath = [Documentspath stringByAppendingPathComponent:@"array.plist"];
    NSArray *array = @[@"haha",@"121",@"nihao",@515];
    [array writeToFile:arrayPath atomically:YES];
    //将字典存到Documents
    NSString *dictionarypath = [Documentspath stringByAppendingPathComponent:@"dictionary.plist"];
    NSDictionary *dictionary = @{@"张三":@26,@"李四":@20};
    [dictionary writeToFile:dictionarypath atomically:YES];
}  
  • NSUserDefaults
(void)writeNSUserDefaults
{
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    [userDefaults setObject:@"周一见" forKey:@"name"];
    [userDefaults setBool:YES forKey:@"sex"];
    [userDefaults setInteger:22 forKey:@"age"];
    UIImage *image = [UIImage imageNamed:@"test.png"];
    NSData *imageData = UIImagePNGRepresentation(image);
    [userDefaults setObject:imageData forKey:@"image"];
    [userDefaults synchronize];   
}

 (void)readNSUserDefaults
{
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    
    NSString *name = [userDefaults objectForKey:@"name"];
    NSInteger age = [userDefaults integerForKey:@"age"];
    NSData *imageData = [userDefaults dataForKey:@"image"];
    UIImage *image = [UIImage imageWithData:imageData];
    
    self.name.text = name;
    self.age.text = [NSString stringWithFormat:@"%ld",age];
    self.faceImage.image = image;  
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容