NSThread 类 线程类
#pragma mark - snippet 代码段
-(void)snippet
{
// NSThread 类 线程类
NSThread *current = [NSThread currentThread];
NSLog(@"snippet's thread : %@",current);
// 判断当前的线程是否为主线程
BOOL result = [NSThread isMainThread];
NSLog(@"snippet is mainThread ? : %d",result);
// 获取主线程
NSThread *mainThread = [NSThread mainThread];
NSLog(@"当前的主线程:%@",mainThread);
// 让线程延迟几秒 在运行
[NSThread sleepForTimeInterval:3];
long a = 0;
for (long i=0 ; i < 10000000; i++) {
a+=i;
}
NSLog(@"a = %ld",a);
}
#pragma mark - 知识点1 多线程方法1:NSObject方法
- (IBAction)sender:(id)sender
{
NSLog(@"NSObject Thread: %@",[NSThread currentThread]);
NSLog(@"NSObject isMainThread ? :%d",[NSThread isMainThread]);
//使用NSObject方法,将执行的代码放在后台线程运行
//即一个子线程中
[self performSelectorInBackground:@selector(snippet) withObject:nil];
}
#pragma mark - 知识点2 多线程方法2:
- (IBAction)sender2:(id)sender
{
// NSThread 线程类 一个对象相当于一个线程
NSThread *thread1 = [[NSThread alloc] initWithTarget:self selector:@selector(snippet) object:nil];
// 设置线程名字
thread1.name = @"aaaa";
//开始
[thread1 start];
[thread1 release];
//sender2 方法2
[NSThread detachNewThreadSelector:@selector(snippet) toTarget:self withObject:nil];
}
#pragma mark - 知识点3 多线程方法3
- (IBAction)NSOperation:(id)sender
{
// NSOperation 类, 它是一个基类,不能直接创建对象,用它的子类创建对象,用它的子类 和系统推荐的两个类 创建对象
// 它的子类对象,相当于一个任务(要执行的代码段)
// 它的原理:将任务放入当前线程中执行
// 1 自定义一个NSOperation 子类:MyOperation
MyOperation *op1 = [[MyOperation alloc] init];
MyOperation *op2 = [[MyOperation alloc] init];
MyOperation *op3 = [[MyOperation alloc] init];
[op1 start];
[op2 start];
[op3 start];
// 2 系统推荐的子类
NSInvocationOperation *invocation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(snippet) object:nil];
[invocation start];
NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{
[self snippet];
}];
[blockOperation start];
}
#pragma mark ** NSOperationQueue实现多线程
- (IBAction)NSOperationQueue:(id)sender
{
// NSOperationQueue 类 任务队列
// 原理:有个 线程池 负责把任务分配给线程,当线程执行完之后,回到线程池,等待下次新任务
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
//设置最大并发数
queue.maxConcurrentOperationCount = 2;
//队列中添加Operation(任务)
MyOperation *op1 = [[MyOperation alloc] init];
MyOperation *op2 = [[MyOperation alloc] init];
MyOperation *op3 = [[MyOperation alloc] init];
MyOperation *op4 = [[MyOperation alloc] init];
[queue addOperation:op1];
[queue addOperation:op2];
[queue addOperation:op3];
[queue addOperation:op4];
[queue addOperationWithBlock:^{
[self snippet];
}];
[queue addOperationWithBlock:^{
[self snippet];
}];
}
#pragma mark - 重点
#pragma mark - 知识点4 多线程方法4 GCD
- (IBAction)GCD:(id)sender
{
// GCD: 大调度中心
// 函数级别,效率高,推荐使用
// 原理:有一个队列,队列中是代码段任务(任务的创建使用block或者函数)
// 队列,可以自定义队列,也可以使用系统队列。
#if 0 //自定义创建队列
// 1 创建一个串行调度队列, 串行即:任务一个一个执行
dispatch_queue_t myQueue = dispatch_queue_create("com.myQueue.www", DISPATCH_QUEUE_SERIAL);
// 2 调用队列中添加任务
dispatch_async(myQueue, ^{
[self snippet];
});
dispatch_async(myQueue, ^{
[self snippet];
});
dispatch_async(myQueue, ^{
[self snippet];
});
#endif
#if 0 //创建自定义并发调度队列
dispatch_queue_t myConQueue = dispatch_queue_create("com.myConQuene", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(myConQueue, ^{
[self snippet];
});
dispatch_async(myConQueue, ^{
[self snippet];
});
dispatch_async(myConQueue, ^{
[self snippet];
});
dispatch_async(myConQueue, ^{
[self snippet];
});
dispatch_async(myConQueue, ^{
[self snippet];
});
#endif
#pragma mark ** 系统队列
#if 0 // 系统队列
// 系统有一个串行队列:main 即主线程
// 有4个并发队列
dispatch_queue_t mainQueue = dispatch_get_main_queue();
// 向调度队列添加任务
dispatch_async(mainQueue, ^{
[self snippet];
});
dispatch_async(mainQueue, ^{
[self snippet];
});
dispatch_async(mainQueue, ^{
[self snippet];
});
#endif
#if 0
// 体统的并发队列
dispatch_queue_t global = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//调度队列添加任务
dispatch_async(mainQueue, ^{
[self snippet];
});
dispatch_async(mainQueue, ^{
[self snippet];
});
dispatch_async(mainQueue, ^{
[self snippet];
});
dispatch_async(mainQueue, ^{
[self snippet];
});
#endif
#pragma mark ** 重点 GCD使用
// 子线程负责 数据的加载
// 主线程负责 刷新 等操作
dispatch_queue_t global = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(global, ^{
NSString *str = @"http://e.hiphotos.baidu.com/image/pic/item/42a98226cffc1e1786934a384890f603738de98f.jpg";
NSURL *url = [NSURL URLWithString:str];
NSData *data = [NSData dataWithContentsOfURL:url];
UIImage *image = [UIImage imageWithData:data];
/* 回到主线程队列,添加任务(刷新任务) */
dispatch_async(dispatch_get_main_queue(), ^{
self.imageview.image = image;
});
});
}
#pragma mark - 知识点5 重点 GCD创建单例
+(instancetype)shareViewController
{
static ViewController *vc = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
vc = [[ViewController alloc] init];
});
return vc;
}
- (void)dealloc {
[_imageview release];
[super dealloc];
}