iOS多线程
来源:互联网 发布:淘宝美即官网是正品吗 编辑:程序博客网 时间:2024/06/17 08:05
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 子类:MyOperationMyOperation *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];
}
0 0
- ios多线程
- iOS多线程
- iOS多线程
- iOS多线程
- 多线程ios
- IOS 多线程
- ios多线程
- ios 多线程
- IOS多线程
- IOS多线程
- iOS多线程
- iOS多线程
- ios 多线程
- iOS多线程
- IOS多线程
- ios多线程
- iOS 多线程
- iOS 多线程
- frame buffer编程--画点功能和新增字符串代替RGBT
- CocoaPods详解之----使用篇
- Nginx和Tomcat负载均衡实现session共享
- 关于ARP欺骗的一点发现
- Android 学习之drawerlayout写侧滑菜单
- iOS多线程
- asp.net中对amCharts(.net版)图形报表的使用
- awk 函数
- AOJ 0033
- 手机自动化测试工具实现
- BroadcastReceiver 广播的使用 (activity广播到fragment中,使用静态的没有成功,我就使用动态的 ,是可以的)
- 107 nginx rewrite规则和alias
- 带有左右箭头的幻灯片展示
- HTTP STATUS CODE DETAIL