码迷,mamicode.com
首页 > 移动开发 > 详细

iOS之多线程

时间:2016-05-23 19:01:22      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:

关于多线程的大概原理,相信大家都有所了解,我就不再赘述了,多线程的实现有多重方式:NSThread、NSObject、NSOperation和GCD,其中较常用的是GCD,下面分别介绍一下基础操作:

首先NSThread开辟子线程:

NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(sayHi) object:nil];//手动开启子线程

[thread start];

[NSThread exit];//使用NSThread和NSObject实现的开辟线程,系统会自动释放,关不关都行

NSThread自动开辟子线程:[NSThread detachNewThreadSelector:@selector(sayHi) toTarget:self withObject:nil];

#pragma mark - NSObject 开启子线程

[self performSelectorInBackground:@selector(sayHi) withObject:@"test"];//开辟子线程:sayHi方法在子线程中实现

[self performSelectorOnMainThread:@selector(mainThreadChangeColor) withObject:nil waitUntilDone:YES];//返回到主线程

#pragma mark - NSOperation——————NSOperation不能直接进行多线程的创建,需要借助:NSOperationQueue

NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(test) object:nil];//使用NSOperarion的第一个子类去创建多线程:NSInvocationOperation

NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"我是子线程");
    }];//使用NSOperation 的第二个子类创建子线程(这里可以只使用其中一个子类):若单独使用(不使用NSOperationQueue,只开辟一个子线程)需要添加开启方法:[blockOperation start];

NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    [queue addOperation:operation];
    [queue addOperation:blockOperation];

#pragma mark - GCD

dispatch_queue_t queue = dispatch_queue_create(DISPATCH_QUEUE_SERIAL, 0);//开辟子线程:串行队列

dispatch_queue_t queue = dispatch_queue_create(0, DISPATCH_QUEUE_CONCURRENT);//开辟子线程:并行队列,串行与并行任选一个

//添加任务(若有多个任务时)//创建串行队列:DISPATCH_QUEUE_SERIAL串行:任务顺序执行;DISPATCH_QUEUE_CONCURRENT并行:任务没有次序

dispatch_async(queue, ^{
 NSLog(@"currentThread1 == %@, mainThread1 == %@, ismain == %d", [NSThread currentThread], [NSThread mainThread], [NSThread isMainThread]);//这里的部分将会在子线程下实现

dispatch_async(dispatch_get_main_queue(), ^{

//返回主线程。这里的部分将会在主线程下实现。一般数据的解析加载在子线程中实现,UI的刷新在主线程中实现,最后会举了简单的小例子说明一下
         });
 });

#++++++解析数据并刷新UI

    //url
    NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];
    //创建请求
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    //创建session
    NSURLSession *session = [NSURLSession sharedSession];
    //创建task
    NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        if (error == nil) {
        //处理数据
            
            //回到主线程刷新UI
            dispatch_async(dispatch_get_main_queue(), ^{
                
                
            });
            
        }
    }];
NSOperationQueue GCD的比较:

NSOperationQueue使用addOperation方法将NSOperation类型的对象加入队列,并且该NSOperation类型的对象是NSOperation的子类创建的对象(NSInvocationOperation和NSBlockOperation);使用NSOperationQueue时不能出现start方法;
 GCD:使用dispatch_queue_create方法创建子线程:根据该方法内的参数的不同从而创建串行队列(DISPATCH_QUEUE_SERIAL)和并行队列(DISPATCH_QUEUE_CONCURRENT);
      使用dispatch_async添加任务;

CGD的应用比较广泛,这里只是对其基本使用做了介绍,想深入了解的找度娘吧

 

iOS之多线程

标签:

原文地址:http://www.cnblogs.com/bdlfbj/p/5515782.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!