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