iOS 多线程
iOS 多线程开发实现方式:
NSThread
NSOperation
3.GCD
1.NSThread, 轻量级多线程,需要自己管理声明周期
创建线程方法
// 1.Block方法创建 (iOS 10 之后可以使用)
- (void)detachNewThreadWithBlock:(void (^)(void))block;
// 2.直接将操作添加到新线程中并执行,该方法无法拿到线程对象
// @param selector 方法名
// @param target 调用对象
// @param argument 参数- (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(nullable id)argument;
// 3.创建线程对象,初始化线程任务,调用start方法启动线程
// @param target 调用对象
// @selector 方法名
// @param argument 参数- (instancetype)initWithTarget:(id)target selector:(SEL)selector object:(nullable id)argument;
// eg:
// 1. block 创建
[NSThread detachNewThreadWithBlock:^{
for (int i = 0; i < 100; i ++) {
KLog(@"%d", i);
}
}];
// 2. 直接将操作添加到新线程中并执行
[NSThread detachNewThreadSelector:@selector(_threadSelector) toTarget:self withObject:nil];
- (void)_threadSelector {
KLogFunc;
for (int i = 0; i < 100000; i ++) {
KLog(@"----------------%d", i);
}
}
// 3.创建线程对象,初始化线程任务, 调用start方法启动线程
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(_threadSelector) object:nil];
- (void)_threadSelector {
KLogFunc;
for (int i = 0; i < 100000; i ++) {
KLog(@"----------------%d", i);
}
}
线程操作
// 线程休眠
- (void)sleepUntilDate:(NSDate *)date;// 让当前线程休眠到某个时间
- (void)sleepForTimeInterval:(NSTimeInterval)time; // 让当前线程休眠多少秒
// 终止线程 - (void)exit;
// 停止线程, 不会立即停止
- (void)cancel;
线程间通信
// 1.在后台执行一个操作
- (void)performSelectorInBackground:(SEL)selector withObject:(id)arg;
// 2.在指定的线程执行一个方法,需要创建线程对象
- (void)performSelector:(SEL)selector onThread:(NSThread *)thread withObject:(id)arg waitUntilDone:(BOOL)wait;
// 3.在主线程执行一个操作
- (void)performSelectorOnMainThread:(SEL)selector withObject:(id)arg waitUntilDone:(BOOL)wait;
// eg:
pragma mark - 添加响应方法触发创建子线程并加载数据
(void)touchesBegan:(NSSet
)touches withEvent:(UIEvent )event
{
// 创建子线程
[self performSelectorInBackground:@selector(loadImage) withObject:nil];
}(void)loadImage
{
NSLog(@”当前线程:%@”, [NSThread currentThread]);
NSLog(@”主线程:%@”, [NSThread mainThread]);NSString *urlStr = @”https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&quality=100&size=b4000_4000&sec=1463455875&di=ef2da3f0fe711b471966aa1511483d0b&src=http://img4.duitang.com/uploads/item/201308/20/20130820094450_rsmYi.jpeg“;
NSURL *url = [NSURL URLWithString:urlStr];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
self.imageData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
// 返回主线程,刷新UI
[self performSelectorOnMainThread:@selector(reloadImageView) withObject:nil waitUntilDone:YES];
}(void)reloadImageView
{
// 进入主线程一般进行来安全判断
if ([NSThread isMainThread]) {// 刷新UI
UIImage *showIamge = [UIImage imageWithData:self.imageData];
self.showImageView.image = showIamge;
}
}
NSOperation, NSOperationQueue 是苹果提供的一套多线程解决方案,基于GCD封装,完全面向对象
NSOperaion 是对任务的封装,封装好的任务交给NSOperationQueue进行串行队列和并行队列执行.这里的任务就是NSOperation类的一个方法,main方法或start方法,在NSOperation类中这两个方法是空实现,自定义NSOperation时需要重写.OC提供了子类(NSBlockOperation 和 NSInvocationOperation)实现多线程
// 创建NSInvocationOperation
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(_operation) object:nil];
// 创建线程队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
// 设置最大并发线程数
queue.maxConcurrentOperationCount = 4;
// 添加到线程队列后,队列中的线程就会开始执行
[queue addOperation:operation];
- (void)_operation {
for (int i = 0; i < 200000; i ++) {
KLog(@"%d", i);
}
}
// 创建NSBlockOperation
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
for (int i = 0; i < 1000; i ++) {
KLog(@"%d", i);
}
}];
[[[NSOperationQueue alloc] init] addOperation:operation];
线程间依赖
// NSOperationQueue 可以控制线程之间的依赖关系.
- (void)test {
// 创建线程队列
NSOperationQueue *operaQueue = [[NSOperationQueue alloc] init];
// 最大并发数
operaQueue.maxConcurrentOperationCount = 5;
NSBlockOperation *lastBlockOperation = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"-----");
}];
// 创建多个线程
for (int i = 0; i < 10; i ++) {
NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"-----");
}];
// 设置依赖操作
[blockOperation addDependency:lastBlockOperation];
[operationQueue addOperation:blockOperation];
}
[operationQueue addOperation:lastBlockOperation];
}
未完结
还没有评论,来说两句吧...