1. 多线程的底层实现?多线程的实现原理?多线程有什么作用?使用场合是什么?
一般问这个的话,比较空泛,分析一下,问题如没实际使用场景的话,可从问题原理上解释
1.1) 首先搞清楚什么是线程、什么是多线程、还可以适当带一下进程的概念。
Mach系统是第一个以多线程方式处理的任务~。(了解)
【学习总结】【多线程】 线程 & 进程 & NSThread(多线程的一套API)
1.2) 解释完基本名词,再告诉他实际开发中,应该怎么用,(着重讲GCD,或者你面试的项目中,使用到的多线程技术)
> IOS开发中实现多线程的方案
l C语言的POSIX接口:#include <pthread.h>
l OC的NSThread
l C语言的GCD接口(性能最好,代码更精简)(掌握)
l OC的NSOperation和NSOperationQueue(基于GCD)
2. 多线程怎么通讯
多线程怎么通讯,以你面试的项目去说明怎么通讯,线程间通讯用得最多的场景就是,子线程下载资源,主线程拿到子线程下载的资源刷新UI
AFN网络通讯框架使用,SDWebImage缓存图片使用技巧
1.1) 线程间通讯通 反正就是,在子线程执行完之后,回到主线程干一些事情。
1> GCD
// 开启一个默认级别的优先级的 异步(async)线程,添加到主队列中
Dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{
// 在这里的代码是子线程的代码,执行完之后在执行block的代码
Dispatch_async(dispatch_get_main_queue(),^{
// 回到主线程
// Block执行完后执行 异步主线程dispatch_get_main : 主线程
// 在这里执行主线程的代码,回到主线程刷新UI
});
});
2 > performSelector: onThread: withObject: waitUntilDone:
// 开启一个默认级别的优先级的 异步(async)线程,添加到主队列中
Dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{
// Block执行完后执行 方法传递数据,子线程执行完毕
// 执行完这个线程的东西后,onThrea 跳回主线程 ,然后执行MyMethoe方法,并将withObject:image数据传递过去
[self performSelector:@selector(MyMethoe:) onThrea:([NSThread mainThread]), withObject:image waitUntilDone:YES modes:nil ];
});
// 这个方法是直接回到主线程
[self performSelectorOnMainThread: @selector(MyMethoe:) withObject:image waitUntilDone:YES ]
-(void) MyMethoe:(UIImage :)image{ }
3> NSMachPort (基于Mach操作系统的多线程)
// 无视了,不研究
3. 网络图片处理问题中怎么解决一个相同的网络地址重复请求的问题?
SDWebImage框架就是帮忙解决这个问题的。(能扯到SDWebImage框架的使用)图片缓存,重复使用等。
4. 用NSOpertion和NSOpertionQueue处理A,B,C三个线程,要求执行完A,B后才能执行C,怎么做?
依赖,例如:
// 创建队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
// 创建3个操作
NSOperation *a = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@”operation1---“);
}];
NSOperation *b = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@”operation1---“);
}];
NSOperation *c = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@”operation1---“);
}];
// 添加依赖, 关键代码,创建依赖后,执行顺序变为C依赖 a,b 所以,ab执行完,C才会执行
[c addDependency:a];
[c addDependency:b];
// 执行操作
[queue addOperation:a];
[queue addOperation:b];
[queue addOperation:c];
5. GCD内部怎么实现的
5.1) 作为了解吧。
1> iOS和OS X的核心是XNU内核,GCD是基于XNU内核实现的
2> GCD的API全部在libdispatch动态库中
3> GCD的底层实现主要有DispatchQueue和Dispatch Source
l DispatchQueue :管理block(操作)
l DispatchSource :处理事件(MACH端口发送,MACH端口接收,检测与进程相关事件等10种事件)
2>performSelector: onThread: withObject:waitUntilDone:
// 开启一个默认级别的优先级的 异步(async)线程,添加到主队列中
Dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{
//Block执行完后执行方法传递数据
//执行完这个线程的东西后,onThrea 跳回主线程,然后执行MyMethoe方法,并将withObject:image数据传递过去
[selfperformSelector:@selector(MyMethoe:) onThrea:([NSThread mainThread]),withObject:image waitUntilDone:YES modes:nil ];
});
//这个方法是直接回到主线程
[self performSelectorOnMainThread: @selector(MyMethoe:)withObject:image waitUntilDone:YES ]
-(void) MyMethoe:(UIImage :)image{ }