IOS多线程
来源:互联网 发布:2选一数据选择器 编辑:程序博客网 时间:2024/06/17 16:47
NSThread 类 线程类
#pragma mark - snippet代码段
-(void)snippet
{
// NSThread类 线程类
NSThread *current = [NSThreadcurrentThread];
NSLog(@"snippet's thread : %@",current);
//判断当前的线程是否为主线程
BOOL result = [NSThreadisMainThread];
NSLog(@"snippet is mainThread ? : %d",result);
//获取主线程
NSThread *mainThread = [NSThreadmainThread];
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: %@",[NSThreadcurrentThread]);
NSLog(@"NSObject isMainThread ? :%d",[NSThreadisMainThread]);
//使用NSObject方法,将执行的代码放在后台线程运行
//即一个子线程中
[selfperformSelectorInBackground:@selector(snippet)withObject:nil];
}
#pragma mark - 知识点2 多线程方法2:
- (IBAction)sender2:(id)sender
{
// NSThread线程类 一个对象相当于一个线程
NSThread *thread1 = [[NSThreadalloc] initWithTarget:selfselector:@selector(snippet)object:nil];
//设置线程名字
thread1.name =@"aaaa";
//开始
[thread1 start];
[thread1 release];
//sender2方法2
[NSThreaddetachNewThreadSelector:@selector(snippet)toTarget:selfwithObject:nil];
}
#pragma mark - 知识点3 多线程方法3
- (IBAction)NSOperation:(id)sender
{
// NSOperation类, 它是一个基类,不能直接创建对象,用它的子类创建对象,用它的子类和系统推荐的两个类 创建对象
//它的子类对象,相当于一个任务(要执行的代码段)
//它的原理:将任务放入当前线程中执行
// 1自定义一个NSOperation 子类:MyOperation
MyOperation *op1 = [[MyOperationalloc] init];
MyOperation *op2 = [[MyOperationalloc] init];
MyOperation *op3 = [[MyOperationalloc] init];
[op1 start];
[op2 start];
[op3 start];
// 2系统推荐的子类
NSInvocationOperation *invocation = [[NSInvocationOperationalloc] initWithTarget:selfselector:@selector(snippet)object:nil];
[invocation start];
NSBlockOperation *blockOperation = [NSBlockOperationblockOperationWithBlock:^{
[selfsnippet];
}];
[blockOperation start];
}
#pragma mark ** NSOperationQueue实现多线程
- (IBAction)NSOperationQueue:(id)sender
{
// NSOperationQueue类 任务队列
//原理:有个 线程池 负责把任务分配给线程,当线程执行完之后,回到线程池,等待下次新任务
NSOperationQueue *queue = [[NSOperationQueuealloc] init];
//设置最大并发数
queue.maxConcurrentOperationCount =2;
//队列中添加Operation(任务)
MyOperation *op1 = [[MyOperationalloc] init];
MyOperation *op2 = [[MyOperationalloc] init];
MyOperation *op3 = [[MyOperationalloc] init];
MyOperation *op4 = [[MyOperationalloc] init];
[queue addOperation:op1];
[queue addOperation:op2];
[queue addOperation:op3];
[queue addOperation:op4];
[queue addOperationWithBlock:^{
[selfsnippet];
}];
[queue addOperationWithBlock:^{
[selfsnippet];
}];
}
#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 = [NSURLURLWithString:str];
NSData *data = [NSDatadataWithContentsOfURL:url];
UIImage *image = [UIImageimageWithData:data];
/*回到主线程队列,添加任务(刷新任务) */
dispatch_async(dispatch_get_main_queue(), ^{
self.imageview.image = image;
});
});
}
#pragma mark - 知识点5 重点 GCD创建单例
+(instancetype)shareViewController
{
staticViewController *vc = nil;
staticdispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
vc = [[ViewControlleralloc] init];
});
return vc;
}
- (void)dealloc {
[_imageviewrelease];
[superdealloc];
}
- ios多线程
- iOS多线程
- iOS多线程
- iOS多线程
- 多线程ios
- IOS 多线程
- ios多线程
- ios 多线程
- IOS多线程
- IOS多线程
- iOS多线程
- iOS多线程
- ios 多线程
- iOS多线程
- IOS多线程
- ios多线程
- iOS 多线程
- iOS 多线程
- 家庭食品包装密实袋的前世今生和未来
- iOS开发--OC篇--OC类与对象
- 函数是第一类值和第二类值与回调函数
- linux中shell变量$#,$@,$0,$1,$2的含义解释:
- freemarker简单用法-给前端
- IOS多线程
- 正则表达式 实战
- springMVC基础版--01基本配置
- char *a 与char a[] 的区别
- IOS 9 Remove CODE_SIGN_RESOURCE_RULES_PATH=$(SDKROOT)/ResourceRules.plist
- Objective-C中的缓存
- Objective-C Runtime
- Eclipse 工程引用 与 Jar打包
- 畅通工程(并查集)